Browse Source

* merged r13762-14047 from trunk

git-svn-id: branches/objc@14048 -
Jonas Maebe 15 years ago
parent
commit
559e284bd0
100 changed files with 10067 additions and 4527 deletions
  1. 84 7
      .gitattributes
  2. 11 0
      compiler/aasmtai.pas
  3. 6 1
      compiler/aggas.pas
  4. 7 0
      compiler/alpha/cgcpu.pas
  5. 51 0
      compiler/arm/aasmcpu.pas
  6. 24 1
      compiler/arm/agarmgas.pas
  7. 12 0
      compiler/arm/aoptcpu.pas
  8. 25 1
      compiler/arm/armatt.inc
  9. 24 0
      compiler/arm/armatts.inc
  10. 48 0
      compiler/arm/armins.dat
  11. 25 1
      compiler/arm/armop.inc
  12. 1098 183
      compiler/arm/cgcpu.pas
  13. 25 10
      compiler/arm/cpubase.pas
  14. 21 6
      compiler/arm/cpuinfo.pas
  15. 2 0
      compiler/arm/narmadd.pas
  16. 33 0
      compiler/arm/raarmgas.pas
  17. 111 0
      compiler/arm/rgcpu.pas
  18. 8 3
      compiler/avr/cgcpu.pas
  19. 9 7
      compiler/cgobj.pas
  20. 95 17
      compiler/dbgdwarf.pas
  21. 47 15
      compiler/dbgstabs.pas
  22. 19 7
      compiler/htypechk.pas
  23. 8 3
      compiler/i386/cgcpu.pas
  24. 8 3
      compiler/m68k/cgcpu.pas
  25. 41 10
      compiler/msg/errord.msg
  26. 41 10
      compiler/msg/errordu.msg
  27. 67 21
      compiler/msg/errore.msg
  28. 1437 1170
      compiler/msg/errorr.msg
  29. 2833 0
      compiler/msg/errorru.msg
  30. 0 2017
      compiler/msg/errorrw.msg
  31. 35 17
      compiler/msgidx.inc
  32. 356 337
      compiler/msgtxt.inc
  33. 8 8
      compiler/ncal.pas
  34. 6 4
      compiler/ncgcon.pas
  35. 1 1
      compiler/ncgld.pas
  36. 9 2
      compiler/ncgutil.pas
  37. 18 14
      compiler/ncnv.pas
  38. 24 3
      compiler/ncon.pas
  39. 391 5
      compiler/nflw.pas
  40. 4 2
      compiler/ninl.pas
  41. 14 12
      compiler/nobj.pas
  42. 10 9
      compiler/nset.pas
  43. 24 0
      compiler/nutils.pas
  44. 1 2
      compiler/options.pas
  45. 17 4
      compiler/pbase.pas
  46. 21 12
      compiler/pdecl.pas
  47. 60 4
      compiler/pdecobj.pas
  48. 88 7
      compiler/pdecsub.pas
  49. 15 2
      compiler/pdecvar.pas
  50. 11 30
      compiler/pexpr.pas
  51. 7 3
      compiler/powerpc/cgcpu.pas
  52. 6 0
      compiler/powerpc64/cgcpu.pas
  53. 186 136
      compiler/pstatmnt.pas
  54. 6 3
      compiler/psub.pas
  55. 3 0
      compiler/psystem.pas
  56. 1 1
      compiler/ptconst.pas
  57. 3 0
      compiler/rautils.pas
  58. 16 1
      compiler/scanner.pas
  59. 8 3
      compiler/sparc/cgcpu.pas
  60. 12 3
      compiler/symconst.pas
  61. 132 1
      compiler/symdef.pas
  62. 94 3
      compiler/symsym.pas
  63. 40 2
      compiler/symtable.pas
  64. 4 0
      compiler/symtype.pas
  65. 1 1
      compiler/systems/i_linux.pas
  66. 11 0
      compiler/systems/t_embed.pas
  67. 9 1
      compiler/tokens.pas
  68. 37 19
      compiler/utils/ppudump.pp
  69. 7 2
      compiler/x86/cgx86.pas
  70. 7 3
      compiler/x86_64/cgcpu.pas
  71. 1 1
      ide/Makefile.fpc
  72. 103 8
      ide/fpdebug.pas
  73. 11 0
      ide/fpide.pas
  74. 2 2
      ide/test.pas
  75. 11 2
      ide/wchmhwrap.pas
  76. 3 1
      installer/install.dat
  77. 1 1
      installer/install.pas
  78. 256 69
      packages/Makefile
  79. 46 25
      packages/Makefile.fpc
  80. 59 59
      packages/chm/Makefile
  81. 1 1
      packages/chm/Makefile.fpc
  82. 6 1
      packages/chm/fpmake.pp
  83. 21 4
      packages/chm/src/chmfiftimain.pas
  84. 30 11
      packages/chm/src/chmfilewriter.pas
  85. 239 3
      packages/chm/src/chmreader.pas
  86. 14 3
      packages/chm/src/chmsitemap.pas
  87. 61 9
      packages/chm/src/chmtypes.pas
  88. 629 38
      packages/chm/src/chmwriter.pas
  89. 529 0
      packages/chm/src/lzxcompressthread.pas
  90. 10 9
      packages/chm/src/paslzxcomp.pas
  91. 27 83
      packages/fcl-base/Makefile
  92. 8 10
      packages/fcl-base/Makefile.fpc
  93. 3 3
      packages/fcl-db/src/codegen/fpcgtiopf.pp
  94. 2 0
      packages/fcl-db/src/codegen/fpddcodegen.pp
  95. 3 3
      packages/fcl-db/src/datadict/fpddfb.pp
  96. 25 7
      packages/fcl-db/src/export/fpdbexport.pp
  97. 16 7
      packages/fcl-db/src/paradox/paradox.pp
  98. 8 6
      packages/fcl-db/src/sqldb/interbase/ibconnection.pp
  99. 5 3
      packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
  100. 14 8
      packages/fcl-db/src/sqldb/sqldb.pp

+ 84 - 7
.gitattributes

@@ -269,7 +269,7 @@ compiler/msg/errorpli.msg svneol=native#text/plain
 compiler/msg/errorptd.msg svneol=native#text/plain
 compiler/msg/errorptd.msg svneol=native#text/plain
 compiler/msg/errorptw.msg svneol=native#text/plain
 compiler/msg/errorptw.msg svneol=native#text/plain
 compiler/msg/errorr.msg svneol=native#text/plain
 compiler/msg/errorr.msg svneol=native#text/plain
-compiler/msg/errorrw.msg svneol=native#text/plain
+compiler/msg/errorru.msg svneol=native#text/plain
 compiler/msg/errorues.msg svneol=native#text/plain
 compiler/msg/errorues.msg svneol=native#text/plain
 compiler/msgidx.inc svneol=native#text/plain
 compiler/msgidx.inc svneol=native#text/plain
 compiler/msgtxt.inc svneol=native#text/plain
 compiler/msgtxt.inc svneol=native#text/plain
@@ -979,6 +979,7 @@ packages/chm/src/chmwriter.pas svneol=native#text/plain
 packages/chm/src/fasthtmlparser.pas svneol=native#text/plain
 packages/chm/src/fasthtmlparser.pas svneol=native#text/plain
 packages/chm/src/htmlindexer.pas svneol=native#text/plain
 packages/chm/src/htmlindexer.pas svneol=native#text/plain
 packages/chm/src/htmlutil.pas svneol=native#text/plain
 packages/chm/src/htmlutil.pas svneol=native#text/plain
+packages/chm/src/lzxcompressthread.pas svneol=native#text/plain
 packages/chm/src/paslznonslide.pas svneol=native#text/plain
 packages/chm/src/paslznonslide.pas svneol=native#text/plain
 packages/chm/src/paslzx.pas svneol=native#text/plain
 packages/chm/src/paslzx.pas svneol=native#text/plain
 packages/chm/src/paslzxcomp.pas svneol=native#text/plain
 packages/chm/src/paslzxcomp.pas svneol=native#text/plain
@@ -1605,7 +1606,6 @@ packages/fcl-base/src/bufstream.pp svneol=native#text/plain
 packages/fcl-base/src/cachecls.pp svneol=native#text/plain
 packages/fcl-base/src/cachecls.pp svneol=native#text/plain
 packages/fcl-base/src/contnrs.pp svneol=native#text/plain
 packages/fcl-base/src/contnrs.pp svneol=native#text/plain
 packages/fcl-base/src/custapp.pp svneol=native#text/plain
 packages/fcl-base/src/custapp.pp svneol=native#text/plain
-packages/fcl-base/src/daemonapp.pp svneol=native#text/plain
 packages/fcl-base/src/dummy/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/dummy/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/eventlog.pp svneol=native#text/plain
 packages/fcl-base/src/eventlog.pp svneol=native#text/plain
 packages/fcl-base/src/fpexprpars.pp svneol=native#text/plain
 packages/fcl-base/src/fpexprpars.pp svneol=native#text/plain
@@ -1630,13 +1630,10 @@ packages/fcl-base/src/streamcoll.pp svneol=native#text/plain
 packages/fcl-base/src/streamex.pp svneol=native#text/plain
 packages/fcl-base/src/streamex.pp svneol=native#text/plain
 packages/fcl-base/src/streamio.pp svneol=native#text/plain
 packages/fcl-base/src/streamio.pp svneol=native#text/plain
 packages/fcl-base/src/syncobjs.pp svneol=native#text/plain
 packages/fcl-base/src/syncobjs.pp svneol=native#text/plain
-packages/fcl-base/src/unix/daemonapp.inc svneol=native#text/plain
 packages/fcl-base/src/unix/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/unix/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/uriparser.pp svneol=native#text/plain
 packages/fcl-base/src/uriparser.pp svneol=native#text/plain
 packages/fcl-base/src/wformat.pp svneol=native#text/plain
 packages/fcl-base/src/wformat.pp svneol=native#text/plain
 packages/fcl-base/src/whtml.pp svneol=native#text/plain
 packages/fcl-base/src/whtml.pp svneol=native#text/plain
-packages/fcl-base/src/win/ServiceManager.pas -text
-packages/fcl-base/src/win/daemonapp.inc svneol=native#text/plain
 packages/fcl-base/src/win/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/win/eventlog.inc svneol=native#text/plain
 packages/fcl-base/src/win/fclel.mc -text
 packages/fcl-base/src/win/fclel.mc -text
 packages/fcl-base/src/win/fclel.rc -text
 packages/fcl-base/src/win/fclel.rc -text
@@ -1839,6 +1836,13 @@ packages/fcl-db/tests/testdddiff.pp svneol=native#text/plain
 packages/fcl-db/tests/testfieldtypes.pas svneol=native#text/plain
 packages/fcl-db/tests/testfieldtypes.pas svneol=native#text/plain
 packages/fcl-db/tests/testsqlscript.pas svneol=native#text/plain
 packages/fcl-db/tests/testsqlscript.pas svneol=native#text/plain
 packages/fcl-db/tests/toolsunit.pas -text
 packages/fcl-db/tests/toolsunit.pas -text
+packages/fcl-extra/Makefile svneol=native#text/plain
+packages/fcl-extra/Makefile.fpc svneol=native#text/plain
+packages/fcl-extra/fpmake.pp svneol=native#text/pascal
+packages/fcl-extra/src/daemonapp.pp svneol=native#text/plain
+packages/fcl-extra/src/unix/daemonapp.inc svneol=native#text/plain
+packages/fcl-extra/src/win/ServiceManager.pas svneol=native#text/plain
+packages/fcl-extra/src/win/daemonapp.inc svneol=native#text/plain
 packages/fcl-fpcunit/Makefile svneol=native#text/plain
 packages/fcl-fpcunit/Makefile svneol=native#text/plain
 packages/fcl-fpcunit/Makefile.fpc svneol=native#text/plain
 packages/fcl-fpcunit/Makefile.fpc svneol=native#text/plain
 packages/fcl-fpcunit/fpmake.pp svneol=native#text/plain
 packages/fcl-fpcunit/fpmake.pp svneol=native#text/plain
@@ -2272,6 +2276,7 @@ packages/fv/src/views.pas svneol=native#text/plain
 packages/fv/src/w32smsg.inc svneol=native#text/plain
 packages/fv/src/w32smsg.inc svneol=native#text/plain
 packages/gdbint/Makefile svneol=native#text/plain
 packages/gdbint/Makefile svneol=native#text/plain
 packages/gdbint/Makefile.fpc svneol=native#text/plain
 packages/gdbint/Makefile.fpc svneol=native#text/plain
+packages/gdbint/examples/mingw.pas svneol=native#text/plain
 packages/gdbint/examples/symify.pp svneol=native#text/plain
 packages/gdbint/examples/symify.pp svneol=native#text/plain
 packages/gdbint/examples/testgdb.pp svneol=native#text/plain
 packages/gdbint/examples/testgdb.pp svneol=native#text/plain
 packages/gdbint/fpmake.pp svneol=native#text/plain
 packages/gdbint/fpmake.pp svneol=native#text/plain
@@ -3304,8 +3309,10 @@ packages/imagemagick/examples/image.png -text svneol=unset#image/png
 packages/imagemagick/examples/screenshot.lpr svneol=native#text/plain
 packages/imagemagick/examples/screenshot.lpr svneol=native#text/plain
 packages/imagemagick/examples/wanddemo.dpr svneol=native#text/plain
 packages/imagemagick/examples/wanddemo.dpr svneol=native#text/plain
 packages/imagemagick/examples/wanddemo.lpr svneol=native#text/plain
 packages/imagemagick/examples/wanddemo.lpr svneol=native#text/plain
+packages/imagemagick/examples/wandpixelaccess.pas svneol=native#text/plain
 packages/imagemagick/fpmake.pp svneol=native#text/plain
 packages/imagemagick/fpmake.pp svneol=native#text/plain
 packages/imagemagick/src/buildim.pp svneol=native#text/plain
 packages/imagemagick/src/buildim.pp svneol=native#text/plain
+packages/imagemagick/src/cache.inc svneol=native#text/plain
 packages/imagemagick/src/cache_view.inc svneol=native#text/plain
 packages/imagemagick/src/cache_view.inc svneol=native#text/plain
 packages/imagemagick/src/compare.inc svneol=native#text/plain
 packages/imagemagick/src/compare.inc svneol=native#text/plain
 packages/imagemagick/src/constitute.inc svneol=native#text/plain
 packages/imagemagick/src/constitute.inc svneol=native#text/plain
@@ -5541,6 +5548,7 @@ packages/winunits-base/src/comconst.pp svneol=native#text/plain
 packages/winunits-base/src/commctrl.pp svneol=native#text/plain
 packages/winunits-base/src/commctrl.pp svneol=native#text/plain
 packages/winunits-base/src/commdlg.pp svneol=native#text/plain
 packages/winunits-base/src/commdlg.pp svneol=native#text/plain
 packages/winunits-base/src/comobj.pp svneol=native#text/plain
 packages/winunits-base/src/comobj.pp svneol=native#text/plain
+packages/winunits-base/src/comserv.pp svneol=native#text/plain
 packages/winunits-base/src/dwmapi.pp svneol=native#text/plain
 packages/winunits-base/src/dwmapi.pp svneol=native#text/plain
 packages/winunits-base/src/flatsb.pp svneol=native#text/plain
 packages/winunits-base/src/flatsb.pp svneol=native#text/plain
 packages/winunits-base/src/htmlhelp.pp svneol=native#text/plain
 packages/winunits-base/src/htmlhelp.pp svneol=native#text/plain
@@ -5556,6 +5564,7 @@ packages/winunits-base/src/shlobj.pp svneol=native#text/plain
 packages/winunits-base/src/tmschema.inc svneol=native#text/plain
 packages/winunits-base/src/tmschema.inc svneol=native#text/plain
 packages/winunits-base/src/uxtheme.pp svneol=native#text/plain
 packages/winunits-base/src/uxtheme.pp svneol=native#text/plain
 packages/winunits-base/src/wininet.pp svneol=native#text/plain
 packages/winunits-base/src/wininet.pp svneol=native#text/plain
+packages/winunits-base/src/winutils.pp svneol=native#text/pascal
 packages/winunits-base/src/winver.pp svneol=native#text/plain
 packages/winunits-base/src/winver.pp svneol=native#text/plain
 packages/winunits-base/tests/OOHelper.pp svneol=native#text/plain
 packages/winunits-base/tests/OOHelper.pp svneol=native#text/plain
 packages/winunits-base/tests/OOTest.pp svneol=native#text/plain
 packages/winunits-base/tests/OOTest.pp svneol=native#text/plain
@@ -5888,6 +5897,18 @@ packages/zlib/Makefile svneol=native#text/plain
 packages/zlib/Makefile.fpc svneol=native#text/plain
 packages/zlib/Makefile.fpc svneol=native#text/plain
 packages/zlib/fpmake.pp svneol=native#text/plain
 packages/zlib/fpmake.pp svneol=native#text/plain
 packages/zlib/src/zlib.pp svneol=native#text/plain
 packages/zlib/src/zlib.pp svneol=native#text/plain
+packages/zorba/Makefile svneol=native#text/plain
+packages/zorba/Makefile.fpc svneol=native#text/plain
+packages/zorba/Package.fpc svneol=native#text/plain
+packages/zorba/examples/simple/simple.lpi svneol=native#text/plain
+packages/zorba/examples/simple/simple.lpr svneol=native#text/plain
+packages/zorba/fpmake.pp svneol=native#text/plain
+packages/zorba/src/zorba.inc svneol=native#text/plain
+packages/zorba/src/zorba.pas svneol=native#text/plain
+packages/zorba/src/zorba_error.inc svneol=native#text/plain
+packages/zorba/src/zorba_options.inc svneol=native#text/plain
+packages/zorba/src/zorba_static_context_consts.inc svneol=native#text/plain
+packages/zorba/src/zorbadyn.pas svneol=native#text/plain
 rtl/COPYING.FPC -text
 rtl/COPYING.FPC -text
 rtl/COPYING.txt svneol=native#text/plain
 rtl/COPYING.txt svneol=native#text/plain
 rtl/Makefile svneol=native#text/plain
 rtl/Makefile svneol=native#text/plain
@@ -5936,6 +5957,7 @@ rtl/arm/setjump.inc svneol=native#text/plain
 rtl/arm/setjumph.inc svneol=native#text/plain
 rtl/arm/setjumph.inc svneol=native#text/plain
 rtl/arm/strings.inc svneol=native#text/plain
 rtl/arm/strings.inc svneol=native#text/plain
 rtl/arm/stringss.inc svneol=native#text/plain
 rtl/arm/stringss.inc svneol=native#text/plain
+rtl/arm/thumb2.inc svneol=native#text/plain
 rtl/atari/os.inc svneol=native#text/plain
 rtl/atari/os.inc svneol=native#text/plain
 rtl/atari/prt0.as svneol=native#text/plain
 rtl/atari/prt0.as svneol=native#text/plain
 rtl/atari/readme -text
 rtl/atari/readme -text
@@ -6042,6 +6064,7 @@ rtl/embedded/Makefile svneol=native#text/plain
 rtl/embedded/Makefile.fpc svneol=native#text/plain
 rtl/embedded/Makefile.fpc svneol=native#text/plain
 rtl/embedded/arm/at91sam7x256.pp svneol=native#text/plain
 rtl/embedded/arm/at91sam7x256.pp svneol=native#text/plain
 rtl/embedded/arm/lpc21x4.pp svneol=native#text/plain
 rtl/embedded/arm/lpc21x4.pp svneol=native#text/plain
+rtl/embedded/arm/stm32f103.pp svneol=native#text/plain
 rtl/embedded/check.inc svneol=native#text/plain
 rtl/embedded/check.inc svneol=native#text/plain
 rtl/embedded/empty.cfg -text
 rtl/embedded/empty.cfg -text
 rtl/embedded/rtl.cfg -text
 rtl/embedded/rtl.cfg -text
@@ -8064,6 +8087,7 @@ tests/tbs/tb0560.pp svneol=native#text/plain
 tests/tbs/tb0561a.pp svneol=native#text/plain
 tests/tbs/tb0561a.pp svneol=native#text/plain
 tests/tbs/tb0561b.pp svneol=native#text/plain
 tests/tbs/tb0561b.pp svneol=native#text/plain
 tests/tbs/tb0564.pp svneol=native#text/plain
 tests/tbs/tb0564.pp svneol=native#text/plain
+tests/tbs/tb0565.pp svneol=native#text/plain
 tests/tbs/tb205.pp svneol=native#text/plain
 tests/tbs/tb205.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
 tests/tbs/ub0069.pp svneol=native#text/plain
 tests/tbs/ub0069.pp svneol=native#text/plain
@@ -8565,6 +8589,7 @@ tests/test/packages/win-base/tdispvar1.pp svneol=native#text/plain
 tests/test/packages/zlib/tzlib1.pp svneol=native#text/plain
 tests/test/packages/zlib/tzlib1.pp svneol=native#text/plain
 tests/test/t4cc1.pp svneol=native#text/plain
 tests/test/t4cc1.pp svneol=native#text/plain
 tests/test/t4cc2.pp svneol=native#text/plain
 tests/test/t4cc2.pp svneol=native#text/plain
+tests/test/tabstract1.pp svneol=native#text/pascal
 tests/test/tabstrcl.pp svneol=native#text/plain
 tests/test/tabstrcl.pp svneol=native#text/plain
 tests/test/tabsvr1.pp svneol=native#text/plain
 tests/test/tabsvr1.pp svneol=native#text/plain
 tests/test/tabsvr2.pp svneol=native#text/plain
 tests/test/tabsvr2.pp svneol=native#text/plain
@@ -8586,6 +8611,7 @@ tests/test/tarray6.pp svneol=native#text/plain
 tests/test/tarray7.pp svneol=native#text/plain
 tests/test/tarray7.pp svneol=native#text/plain
 tests/test/tasmread.pp svneol=native#text/plain
 tests/test/tasmread.pp svneol=native#text/plain
 tests/test/tasout.pp svneol=native#text/plain
 tests/test/tasout.pp svneol=native#text/plain
+tests/test/tassignmentoperator1.pp svneol=native#text/pascal
 tests/test/tbopr.pp svneol=native#text/plain
 tests/test/tbopr.pp svneol=native#text/plain
 tests/test/tbrtlevt.pp svneol=native#text/plain
 tests/test/tbrtlevt.pp svneol=native#text/plain
 tests/test/tcase1.pp svneol=native#text/plain
 tests/test/tcase1.pp svneol=native#text/plain
@@ -8650,12 +8676,14 @@ tests/test/tclass5.pp svneol=native#text/plain
 tests/test/tclass6.pp svneol=native#text/plain
 tests/test/tclass6.pp svneol=native#text/plain
 tests/test/tclass7.pp svneol=native#text/plain
 tests/test/tclass7.pp svneol=native#text/plain
 tests/test/tclass8.pp svneol=native#text/plain
 tests/test/tclass8.pp svneol=native#text/plain
+tests/test/tclassinfo1.pp svneol=native#text/pascal
 tests/test/tclrprop.pp svneol=native#text/plain
 tests/test/tclrprop.pp svneol=native#text/plain
 tests/test/tcmp.pp svneol=native#text/plain
 tests/test/tcmp.pp svneol=native#text/plain
 tests/test/tcmp0.pp svneol=native#text/plain
 tests/test/tcmp0.pp svneol=native#text/plain
 tests/test/tendian1.pp svneol=native#text/plain
 tests/test/tendian1.pp svneol=native#text/plain
 tests/test/tenum1.pp svneol=native#text/plain
 tests/test/tenum1.pp svneol=native#text/plain
 tests/test/tenum2.pp svneol=native#text/plain
 tests/test/tenum2.pp svneol=native#text/plain
+tests/test/tenumerators1.pp svneol=native#text/pascal
 tests/test/testcmem.pp svneol=native#text/plain
 tests/test/testcmem.pp svneol=native#text/plain
 tests/test/testda1.pp svneol=native#text/plain
 tests/test/testda1.pp svneol=native#text/plain
 tests/test/testfpuc.pp svneol=native#text/plain
 tests/test/testfpuc.pp svneol=native#text/plain
@@ -8683,6 +8711,30 @@ tests/test/texception7.pp svneol=native#text/plain
 tests/test/texception8.pp svneol=native#text/plain
 tests/test/texception8.pp svneol=native#text/plain
 tests/test/texception9.pp svneol=native#text/plain
 tests/test/texception9.pp svneol=native#text/plain
 tests/test/tfillchr.pp svneol=native#text/plain
 tests/test/tfillchr.pp svneol=native#text/plain
+tests/test/tfinal1.pp svneol=native#text/pascal
+tests/test/tfinal2.pp svneol=native#text/pascal
+tests/test/tforin1.pp svneol=native#text/pascal
+tests/test/tforin10.pp svneol=native#text/plain
+tests/test/tforin11.pp svneol=native#text/plain
+tests/test/tforin12.pp svneol=native#text/pascal
+tests/test/tforin13.pp svneol=native#text/pascal
+tests/test/tforin14.pp svneol=native#text/pascal
+tests/test/tforin15.pp svneol=native#text/pascal
+tests/test/tforin16.pp svneol=native#text/pascal
+tests/test/tforin17.pp svneol=native#text/pascal
+tests/test/tforin18.pp svneol=native#text/pascal
+tests/test/tforin19.pp svneol=native#text/pascal
+tests/test/tforin2.pp svneol=native#text/pascal
+tests/test/tforin20.pp svneol=native#text/pascal
+tests/test/tforin21.pp svneol=native#text/pascal
+tests/test/tforin22.pp svneol=native#text/pascal
+tests/test/tforin3.pp svneol=native#text/pascal
+tests/test/tforin4.pp svneol=native#text/pascal
+tests/test/tforin5.pp svneol=native#text/pascal
+tests/test/tforin6.pp svneol=native#text/pascal
+tests/test/tforin7.pp svneol=native#text/pascal
+tests/test/tforin8.pp svneol=native#text/pascal
+tests/test/tforin9.pp svneol=native#text/pascal
 tests/test/tfpu1.pp svneol=native#text/plain
 tests/test/tfpu1.pp svneol=native#text/plain
 tests/test/tfpu2.pp svneol=native#text/plain
 tests/test/tfpu2.pp svneol=native#text/plain
 tests/test/tfpu3.pp svneol=native#text/plain
 tests/test/tfpu3.pp svneol=native#text/plain
@@ -8815,6 +8867,7 @@ tests/test/tobject1.pp svneol=native#text/plain
 tests/test/tobject2.pp svneol=native#text/plain
 tests/test/tobject2.pp svneol=native#text/plain
 tests/test/tobject3.pp svneol=native#text/plain
 tests/test/tobject3.pp svneol=native#text/plain
 tests/test/tobject4.pp svneol=native#text/plain
 tests/test/tobject4.pp svneol=native#text/plain
+tests/test/tobject5.pp svneol=native#text/pascal
 tests/test/toperator1.pp svneol=native#text/plain
 tests/test/toperator1.pp svneol=native#text/plain
 tests/test/toperator2.pp svneol=native#text/plain
 tests/test/toperator2.pp svneol=native#text/plain
 tests/test/toperator3.pp svneol=native#text/plain
 tests/test/toperator3.pp svneol=native#text/plain
@@ -8912,6 +8965,10 @@ tests/test/trtti2.pp svneol=native#text/plain
 tests/test/trtti3.pp svneol=native#text/plain
 tests/test/trtti3.pp svneol=native#text/plain
 tests/test/trtti4.pp svneol=native#text/plain
 tests/test/trtti4.pp svneol=native#text/plain
 tests/test/trtti5.pp svneol=native#text/plain
 tests/test/trtti5.pp svneol=native#text/plain
+tests/test/tsealed1.pp svneol=native#text/pascal
+tests/test/tsealed2.pp svneol=native#text/pascal
+tests/test/tsealed3.pp svneol=native#text/pascal
+tests/test/tsealed4.pp svneol=native#text/pascal
 tests/test/tsel1.pp svneol=native#text/plain
 tests/test/tsel1.pp svneol=native#text/plain
 tests/test/tsel2.pp svneol=native#text/plain
 tests/test/tsel2.pp svneol=native#text/plain
 tests/test/tset1.pp svneol=native#text/plain
 tests/test/tset1.pp svneol=native#text/plain
@@ -8943,6 +9000,7 @@ tests/test/tstrreal1.pp svneol=native#text/plain
 tests/test/tstrreal2.pp svneol=native#text/plain
 tests/test/tstrreal2.pp svneol=native#text/plain
 tests/test/tstrreal3.pp svneol=native#text/plain
 tests/test/tstrreal3.pp svneol=native#text/plain
 tests/test/tsubdecl.pp svneol=native#text/plain
 tests/test/tsubdecl.pp svneol=native#text/plain
+tests/test/tsymlibrary1.pp svneol=native#text/pascal
 tests/test/tunaligned1.pp svneol=native#text/plain
 tests/test/tunaligned1.pp svneol=native#text/plain
 tests/test/tunistr1.pp svneol=native#text/plain
 tests/test/tunistr1.pp svneol=native#text/plain
 tests/test/tunistr2.pp svneol=native#text/plain
 tests/test/tunistr2.pp svneol=native#text/plain
@@ -9237,8 +9295,18 @@ tests/webtbf/tw14104b.pp svneol=native#text/plain
 tests/webtbf/tw14104c.pp svneol=native#text/plain
 tests/webtbf/tw14104c.pp svneol=native#text/plain
 tests/webtbf/tw14248.pp svneol=native#text/plain
 tests/webtbf/tw14248.pp svneol=native#text/plain
 tests/webtbf/tw1432.pp svneol=native#text/plain
 tests/webtbf/tw1432.pp svneol=native#text/plain
+tests/webtbf/tw14650.pp svneol=native#text/plain
+tests/webtbf/tw14650a.pp svneol=native#text/plain
 tests/webtbf/tw1467.pp svneol=native#text/plain
 tests/webtbf/tw1467.pp svneol=native#text/plain
+tests/webtbf/tw14713.pp svneol=native#text/plain
+tests/webtbf/tw14713a.pp svneol=native#text/plain
+tests/webtbf/tw14777.pp svneol=native#text/plain
+tests/webtbf/tw14777a.pp svneol=native#text/plain
 tests/webtbf/tw1483.pp svneol=native#text/plain
 tests/webtbf/tw1483.pp svneol=native#text/plain
+tests/webtbf/tw14849.pp svneol=native#text/plain
+tests/webtbf/tw14929a.pp svneol=native#text/plain
+tests/webtbf/tw14929b.pp svneol=native#text/plain
+tests/webtbf/tw14946.pp svneol=native#text/plain
 tests/webtbf/tw1599.pp svneol=native#text/plain
 tests/webtbf/tw1599.pp svneol=native#text/plain
 tests/webtbf/tw1599b.pp svneol=native#text/plain
 tests/webtbf/tw1599b.pp svneol=native#text/plain
 tests/webtbf/tw1633.pp svneol=native#text/plain
 tests/webtbf/tw1633.pp svneol=native#text/plain
@@ -9834,10 +9902,16 @@ tests/webtbs/tw1450.pp svneol=native#text/plain
 tests/webtbs/tw1451.pp svneol=native#text/plain
 tests/webtbs/tw1451.pp svneol=native#text/plain
 tests/webtbs/tw14514.pp svneol=native#text/plain
 tests/webtbs/tw14514.pp svneol=native#text/plain
 tests/webtbs/tw14536.pp svneol=native#text/plain
 tests/webtbs/tw14536.pp svneol=native#text/plain
+tests/webtbs/tw14553.pp svneol=native#text/pascal
+tests/webtbs/tw14617.pp svneol=native#text/plain
 tests/webtbs/tw1470.pp svneol=native#text/plain
 tests/webtbs/tw1470.pp svneol=native#text/plain
 tests/webtbs/tw1472.pp svneol=native#text/plain
 tests/webtbs/tw1472.pp svneol=native#text/plain
+tests/webtbs/tw14729.pp svneol=native#text/plain
+tests/webtbs/tw14740.pp svneol=native#text/plain
+tests/webtbs/tw14743.pp svneol=native#text/pascal
 tests/webtbs/tw1477.pp svneol=native#text/plain
 tests/webtbs/tw1477.pp svneol=native#text/plain
 tests/webtbs/tw1479.pp svneol=native#text/plain
 tests/webtbs/tw1479.pp svneol=native#text/plain
+tests/webtbs/tw14812.pp svneol=native#text/plain
 tests/webtbs/tw1485.pp svneol=native#text/plain
 tests/webtbs/tw1485.pp svneol=native#text/plain
 tests/webtbs/tw1489.pp svneol=native#text/plain
 tests/webtbs/tw1489.pp svneol=native#text/plain
 tests/webtbs/tw1501.pp svneol=native#text/plain
 tests/webtbs/tw1501.pp svneol=native#text/plain
@@ -10827,6 +10901,7 @@ utils/fpdoc/Makefile svneol=native#text/plain
 utils/fpdoc/Makefile.fpc svneol=native#text/plain
 utils/fpdoc/Makefile.fpc svneol=native#text/plain
 utils/fpdoc/README.txt svneol=native#text/plain
 utils/fpdoc/README.txt svneol=native#text/plain
 utils/fpdoc/dglobals.pp svneol=native#text/plain
 utils/fpdoc/dglobals.pp svneol=native#text/plain
+utils/fpdoc/dw_dxml.pp svneol=native#text/plain
 utils/fpdoc/dw_html.pp svneol=native#text/plain
 utils/fpdoc/dw_html.pp svneol=native#text/plain
 utils/fpdoc/dw_htmlchm.inc svneol=native#text/plain
 utils/fpdoc/dw_htmlchm.inc svneol=native#text/plain
 utils/fpdoc/dw_ipf.pp svneol=native#text/plain
 utils/fpdoc/dw_ipf.pp svneol=native#text/plain
@@ -10972,12 +11047,12 @@ utils/h2pas/Makefile.fpc svneol=native#text/plain
 utils/h2pas/README.txt svneol=native#text/plain
 utils/h2pas/README.txt svneol=native#text/plain
 utils/h2pas/converu.pas svneol=native#text/plain
 utils/h2pas/converu.pas svneol=native#text/plain
 utils/h2pas/h2pas.pas svneol=native#text/plain
 utils/h2pas/h2pas.pas svneol=native#text/plain
-utils/h2pas/h2pas.y -text
+utils/h2pas/h2pas.y svneol=native#text/plain
 utils/h2pas/h2paspp.pas svneol=native#text/plain
 utils/h2pas/h2paspp.pas svneol=native#text/plain
 utils/h2pas/h2plexlib.pas svneol=native#text/plain
 utils/h2pas/h2plexlib.pas svneol=native#text/plain
 utils/h2pas/h2poptions.pas svneol=native#text/plain
 utils/h2pas/h2poptions.pas svneol=native#text/plain
 utils/h2pas/h2pyacclib.pas svneol=native#text/plain
 utils/h2pas/h2pyacclib.pas svneol=native#text/plain
-utils/h2pas/scan.l -text
+utils/h2pas/scan.l svneol=native#text/plain
 utils/h2pas/scan.pas svneol=native#text/plain
 utils/h2pas/scan.pas svneol=native#text/plain
 utils/h2pas/testit.h -text
 utils/h2pas/testit.h -text
 utils/h2pas/yylex.cod -text
 utils/h2pas/yylex.cod -text
@@ -11000,6 +11075,8 @@ utils/ppdep.pp svneol=native#text/plain
 utils/ptop.pp svneol=native#text/plain
 utils/ptop.pp svneol=native#text/plain
 utils/ptopu.pp svneol=native#text/plain
 utils/ptopu.pp svneol=native#text/plain
 utils/rmcvsdir.pp svneol=native#text/plain
 utils/rmcvsdir.pp svneol=native#text/plain
+utils/rmwait/Makefile.fpc svneol=native#text/plain
+utils/rmwait/rmwait.pas svneol=native#text/plain
 utils/rstconv.pp svneol=native#text/plain
 utils/rstconv.pp svneol=native#text/plain
 utils/sim_pasc/Answers svneol=native#text/plain
 utils/sim_pasc/Answers svneol=native#text/plain
 utils/sim_pasc/ChangeLog svneol=native#text/plain
 utils/sim_pasc/ChangeLog svneol=native#text/plain

+ 11 - 0
compiler/aasmtai.pas

@@ -76,6 +76,9 @@ interface
 {$ifdef m68k}
 {$ifdef m68k}
           ait_labeled_instruction,
           ait_labeled_instruction,
 {$endif m68k}
 {$endif m68k}
+{$ifdef arm}
+          ait_thumb_func,
+{$endif arm}
           { used to split into tiny assembler files }
           { used to split into tiny assembler files }
           ait_cutobject,
           ait_cutobject,
           ait_regalloc,
           ait_regalloc,
@@ -160,6 +163,9 @@ interface
 {$ifdef m68k}
 {$ifdef m68k}
           'labeled_instr',
           'labeled_instr',
 {$endif m68k}
 {$endif m68k}
+{$ifdef arm}
+          'thumb_func',
+{$endif arm}
           'cut',
           'cut',
           'regalloc',
           'regalloc',
           'tempalloc',
           'tempalloc',
@@ -173,6 +179,7 @@ interface
        { ARM only }
        { ARM only }
        ,top_regset
        ,top_regset
        ,top_shifterop
        ,top_shifterop
+       ,top_conditioncode
 {$endif arm}
 {$endif arm}
 {$ifdef m68k}
 {$ifdef m68k}
        { m68k only }
        { m68k only }
@@ -208,6 +215,7 @@ interface
       {$ifdef arm}
       {$ifdef arm}
           top_regset : (regset:^tcpuregisterset);
           top_regset : (regset:^tcpuregisterset);
           top_shifterop : (shifterop : pshifterop);
           top_shifterop : (shifterop : pshifterop);
+          top_conditioncode: (cc: TAsmCond);
       {$endif arm}
       {$endif arm}
       {$ifdef m68k}
       {$ifdef m68k}
           top_regset : (regset:^tcpuregisterset);
           top_regset : (regset:^tcpuregisterset);
@@ -231,6 +239,9 @@ interface
                      ait_stab,ait_function_name,
                      ait_stab,ait_function_name,
                      ait_cutobject,ait_marker,ait_align,ait_section,ait_comment,
                      ait_cutobject,ait_marker,ait_align,ait_section,ait_comment,
                      ait_const,
                      ait_const,
+{$ifdef arm}
+                     ait_thumb_func,
+{$endif arm}
                      ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
                      ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
                      ait_symbol
                      ait_symbol
                     ];
                     ];

+ 6 - 1
compiler/aggas.pas

@@ -34,7 +34,6 @@ interface
       aasmbase,aasmtai,aasmdata,aasmcpu,
       aasmbase,aasmtai,aasmdata,aasmcpu,
       assemble;
       assemble;
 
 
-
     type
     type
       TCPUInstrWriter = class;
       TCPUInstrWriter = class;
       {# This is a derived class which is used to write
       {# This is a derived class which is used to write
@@ -1075,6 +1074,12 @@ implementation
                else
                else
                  AsmWriteLn(tai_symbol(hp).sym.name + '=' + tostr(tai_symbol(hp).value));
                  AsmWriteLn(tai_symbol(hp).sym.name + '=' + tostr(tai_symbol(hp).value));
              end;
              end;
+{$ifdef arm}
+           ait_thumb_func:
+             begin
+               AsmWriteLn(#9'.thumb_func');
+             end;
+{$endif arm}
 
 
            ait_symbol_end :
            ait_symbol_end :
              begin
              begin

+ 7 - 0
compiler/alpha/cgcpu.pas

@@ -51,6 +51,8 @@ tcgalpha = class(tcg)
   procedure g_restore_frame_pointer(list : TAsmList);override;
   procedure g_restore_frame_pointer(list : TAsmList);override;
 end;
 end;
 
 
+procedure create_codegen;
+
 implementation
 implementation
 
 
 uses
 uses
@@ -157,4 +159,9 @@ begin
 end;
 end;
 
 
 
 
+procedure create_codegen;
+  begin
+    cg:=tcgalpha.create;
+  end;
+
 end.
 end.

+ 51 - 0
compiler/arm/aasmcpu.pas

@@ -103,6 +103,8 @@ uses
       { co proc. ld/st operations }
       { co proc. ld/st operations }
       OT_AM5       = $00080000;
       OT_AM5       = $00080000;
       OT_AMMASK    = $000f0000;
       OT_AMMASK    = $000f0000;
+      { IT instruction }
+      OT_CONDITION = $00100000;
 
 
       OT_MEMORYAM2 = OT_MEMORY or OT_AM2;
       OT_MEMORYAM2 = OT_MEMORY or OT_AM2;
       OT_MEMORYAM3 = OT_MEMORY or OT_AM3;
       OT_MEMORYAM3 = OT_MEMORY or OT_AM3;
@@ -159,6 +161,7 @@ uses
          roundingmode : troundingmode;
          roundingmode : troundingmode;
          procedure loadshifterop(opidx:longint;const so:tshifterop);
          procedure loadshifterop(opidx:longint;const so:tshifterop);
          procedure loadregset(opidx:longint;const s:tcpuregisterset);
          procedure loadregset(opidx:longint;const s:tcpuregisterset);
+         procedure loadconditioncode(opidx:longint;const cond:tasmcond);
          constructor op_none(op : tasmop);
          constructor op_none(op : tasmop);
 
 
          constructor op_reg(op : tasmop;_op1 : tregister);
          constructor op_reg(op : tasmop;_op1 : tregister);
@@ -180,6 +183,9 @@ uses
          { SFM/LFM }
          { SFM/LFM }
          constructor op_reg_const_ref(op : tasmop;_op1 : tregister;_op2 : aint;_op3 : treference);
          constructor op_reg_const_ref(op : tasmop;_op1 : tregister;_op2 : aint;_op3 : treference);
 
 
+         { ITxxx }
+         constructor op_cond(op: tasmop; cond: tasmcond);
+
          { *M*LL }
          { *M*LL }
          constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
          constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
 
 
@@ -229,6 +235,10 @@ uses
         { nothing to add }
         { nothing to add }
       end;
       end;
 
 
+      tai_thumb_func = class(tai)
+        constructor create;
+      end;
+
     function spilling_create_load(const ref:treference;r:tregister):Taicpu;
     function spilling_create_load(const ref:treference;r:tregister):Taicpu;
     function spilling_create_store(r:tregister; const ref:treference):Taicpu;
     function spilling_create_store(r:tregister; const ref:treference):Taicpu;
 
 
@@ -290,6 +300,19 @@ implementation
       end;
       end;
 
 
 
 
+    procedure taicpu.loadconditioncode(opidx:longint;const cond:tasmcond);
+      begin
+        allocate_oper(opidx+1);
+        with oper[opidx]^ do
+         begin
+           if typ<>top_conditioncode then
+             clearop(opidx);
+           cc:=cond;
+           typ:=top_conditioncode;
+         end;
+      end;
+
+
 {*****************************************************************************
 {*****************************************************************************
                                  taicpu Constructors
                                  taicpu Constructors
 *****************************************************************************}
 *****************************************************************************}
@@ -402,6 +425,14 @@ implementation
       end;
       end;
 
 
 
 
+    constructor taicpu.op_cond(op: tasmop; cond: tasmcond);
+      begin
+        inherited create(op);
+        ops:=0;
+        condition := cond;
+      end;
+
+
      constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
      constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
        begin
        begin
          inherited create(op);
          inherited create(op);
@@ -574,6 +605,20 @@ implementation
             else
             else
               { check for pre/post indexed }
               { check for pre/post indexed }
               result := operand_read;
               result := operand_read;
+          //Thumb2
+          A_LSL, A_LSR, A_ROR, A_ASR, A_SDIV, A_UDIV,A_MOVT:
+            if opnr in [0] then
+              result:=operand_write
+            else
+              result:=operand_read;
+          A_LDREX:
+            if opnr in [0] then
+              result:=operand_write
+            else
+              result:=operand_read;
+          A_STREX:
+            if opnr in [0,1,2] then
+              result:=operand_write;
           else
           else
             internalerror(200403151);
             internalerror(200403151);
         end;
         end;
@@ -2516,6 +2561,12 @@ static char *CC[] =
 *)
 *)
 {$endif dummy}
 {$endif dummy}
 
 
+  constructor tai_thumb_func.create;
+    begin
+      inherited create;
+      typ:=ait_thumb_func;
+    end;
+
 begin
 begin
   cai_align:=tai_align;
   cai_align:=tai_align;
 end.
 end.

+ 24 - 1
compiler/arm/agarmgas.pas

@@ -38,6 +38,7 @@ unit agarmgas;
       TARMGNUAssembler=class(TGNUassembler)
       TARMGNUAssembler=class(TGNUassembler)
         constructor create(smart: boolean); override;
         constructor create(smart: boolean); override;
         function MakeCmdLine: TCmdStr; override;
         function MakeCmdLine: TCmdStr; override;
+        procedure WriteExtraHeader; override;
       end;
       end;
 
 
      TArmInstrWriter=class(TCPUInstrWriter)
      TArmInstrWriter=class(TCPUInstrWriter)
@@ -79,6 +80,18 @@ unit agarmgas;
         result:=inherited MakeCmdLine;
         result:=inherited MakeCmdLine;
         if (current_settings.fputype = fpu_soft) then
         if (current_settings.fputype = fpu_soft) then
           result:='-mfpu=softvfp '+result;
           result:='-mfpu=softvfp '+result;
+
+        if current_settings.cputype = cpu_cortexm3 then
+          result:='-mcpu=cortex-m3 -mthumb -mthumb-interwork '+result;
+        if current_settings.cputype = cpu_armv7m then
+          result:='-march=armv7m -mthumb -mthumb-interwork '+result;
+      end;
+
+    procedure TArmGNUAssembler.WriteExtraHeader;
+      begin
+        inherited WriteExtraHeader;
+        if current_settings.cputype in cpu_thumb2 then
+          AsmWriteLn(#9'.syntax unified');
       end;
       end;
 
 
 {****************************************************************************}
 {****************************************************************************}
@@ -189,6 +202,8 @@ unit agarmgas;
                   end;
                   end;
               getopstr:=getopstr+'}';
               getopstr:=getopstr+'}';
             end;
             end;
+			    top_conditioncode:
+			      getopstr:=cond2str[o.cc];
           top_ref:
           top_ref:
             if o.ref^.refaddr=addr_full then
             if o.ref^.refaddr=addr_full then
               begin
               begin
@@ -215,7 +230,15 @@ unit agarmgas;
         sep: string[3];
         sep: string[3];
     begin
     begin
       op:=taicpu(hp).opcode;
       op:=taicpu(hp).opcode;
-      s:=#9+gas_op2str[op]+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix];
+      if current_settings.cputype in cpu_thumb2 then
+        begin
+          if taicpu(hp).ops = 0 then
+            s:=#9+gas_op2str[op]+' '+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix]
+          else
+            s:=#9+gas_op2str[op]+oppostfix2str[taicpu(hp).oppostfix]+cond2str[taicpu(hp).condition]; // Conditional infixes are deprecated in unified syntax
+        end
+      else
+        s:=#9+gas_op2str[op]+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix];
       if taicpu(hp).ops<>0 then
       if taicpu(hp).ops<>0 then
         begin
         begin
           sep:=#9;
           sep:=#9;

+ 12 - 0
compiler/arm/aoptcpu.pas

@@ -36,6 +36,12 @@ Type
     function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
     function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
     procedure PeepHoleOptPass2;override;
     procedure PeepHoleOptPass2;override;
   End;
   End;
+  
+  
+  TCpuThumb2AsmOptimizer = class(TCpuAsmOptimizer)
+    { uses the same constructor as TAopObj }
+    procedure PeepHoleOptPass2;override;
+  End;
 
 
 Implementation
 Implementation
 
 
@@ -322,6 +328,12 @@ Implementation
         end;
         end;
     end;
     end;
 
 
+
+  procedure TCpuThumb2AsmOptimizer.PeepHoleOptPass2;
+    begin
+      { TODO: Add optimizer code }
+    end;
+
 begin
 begin
   casmoptimizer:=TCpuAsmOptimizer;
   casmoptimizer:=TCpuAsmOptimizer;
 End.
 End.

+ 25 - 1
compiler/arm/armatt.inc

@@ -177,5 +177,29 @@
 'ftouid',
 'ftouid',
 'ftouis',
 'ftouis',
 'fuitod',
 'fuitod',
-'fuitos'
+'fuitos',
+'asr',
+'lsr',
+'lsl',
+'ror',
+'sdiv',
+'udiv',
+'movt',
+'ldrex',
+'strex',
+'it',
+'ite',
+'itt',
+'itee',
+'itte',
+'itet',
+'ittt',
+'iteee',
+'ittee',
+'itete',
+'ittte',
+'iteet',
+'ittet',
+'itett',
+'itttt'
 );
 );

+ 24 - 0
compiler/arm/armatts.inc

@@ -177,5 +177,29 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 attsufNONE
 );
 );

+ 48 - 0
compiler/arm/armins.dat

@@ -573,3 +573,51 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 [FUITODcc]
 [FUITODcc]
 
 
 [FUITOScc]
 [FUITOScc]
+
+[ASRcc]
+
+[LSRcc]
+
+[LSLcc]
+
+[RORcc]
+
+[SDIVcc]
+
+[UDIVcc]
+
+[MOVTcc]
+
+[LDREXcc]
+
+[STREXcc]
+
+[IT]
+
+[ITE]
+
+[ITT]
+
+[ITEE]
+
+[ITTE]
+
+[ITET]
+
+[ITTT]
+
+[ITEEE]
+
+[ITTEE]
+
+[ITETE]
+
+[ITTTE]
+
+[ITEET]
+
+[ITTET]
+
+[ITETT]
+
+[ITTTT]

+ 25 - 1
compiler/arm/armop.inc

@@ -177,5 +177,29 @@ A_FTOSIS,
 A_FTOUID,
 A_FTOUID,
 A_FTOUIS,
 A_FTOUIS,
 A_FUITOD,
 A_FUITOD,
-A_FUITOS
+A_FUITOS,
+A_ASR,
+A_LSR,
+A_LSL,
+A_ROR,
+A_SDIV,
+A_UDIV,
+A_MOVT,
+A_LDREX,
+A_STREX,
+A_IT,
+A_ITE,
+A_ITT,
+A_ITEE,
+A_ITTE,
+A_ITET,
+A_ITTT,
+A_ITEEE,
+A_ITTEE,
+A_ITETE,
+A_ITTTE,
+A_ITEET,
+A_ITTET,
+A_ITETT,
+A_ITTTT
 );
 );

+ 1098 - 183
compiler/arm/cgcpu.pas

@@ -39,8 +39,6 @@ unit cgcpu;
       tcgarm = class(tcg)
       tcgarm = class(tcg)
         { true, if the next arithmetic operation should modify the flags }
         { true, if the next arithmetic operation should modify the flags }
         cgsetflags : boolean;
         cgsetflags : boolean;
-        procedure init_register_allocators;override;
-        procedure done_register_allocators;override;
 
 
         procedure a_param_const(list : TAsmList;size : tcgsize;a : aint;const paraloc : TCGPara);override;
         procedure a_param_const(list : TAsmList;size : tcgsize;a : aint;const paraloc : TCGPara);override;
         procedure a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);override;
         procedure a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);override;
@@ -61,9 +59,7 @@ unit cgcpu;
         procedure a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation);override;
 
 
         { move instructions }
         { move instructions }
-        procedure a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);override;
         procedure a_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference);override;
         procedure a_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference);override;
-        procedure a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);override;
         procedure a_load_reg_reg(list : TAsmList; fromsize, tosize : tcgsize;reg1,reg2 : tregister);override;
         procedure a_load_reg_reg(list : TAsmList; fromsize, tosize : tcgsize;reg1,reg2 : tregister);override;
         function a_internal_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference):treference;
         function a_internal_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference):treference;
         function a_internal_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister):treference;
         function a_internal_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister):treference;
@@ -103,7 +99,7 @@ unit cgcpu;
 
 
         procedure a_jmp_cond(list : TAsmList;cond : TOpCmp;l: tasmlabel);
         procedure a_jmp_cond(list : TAsmList;cond : TOpCmp;l: tasmlabel);
         procedure fixref(list : TAsmList;var ref : treference);
         procedure fixref(list : TAsmList;var ref : treference);
-        function handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference;
+        function handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference; virtual;
 
 
         procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
         procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
         procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: aint); override;
         procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: aint); override;
@@ -115,6 +111,14 @@ unit cgcpu;
         function get_darwin_call_stub(const s: string; weak: boolean): tasmsymbol;
         function get_darwin_call_stub(const s: string; weak: boolean): tasmsymbol;
       end;
       end;
 
 
+      tarmcgarm = class(tcgarm)
+        procedure init_register_allocators;override;
+        procedure done_register_allocators;override;
+
+        procedure a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);override;
+        procedure a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);override;
+      end;
+
       tcg64farm = class(tcg64f32)
       tcg64farm = class(tcg64f32)
         procedure a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);override;
         procedure a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);override;
         procedure a_op64_const_reg(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;reg : tregister64);override;
         procedure a_op64_const_reg(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;reg : tregister64);override;
@@ -124,6 +128,30 @@ unit cgcpu;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
       end;
       end;
 
 
+      Tthumb2cgarm = class(tcgarm)
+        procedure init_register_allocators;override;
+        procedure done_register_allocators;override;
+
+        procedure a_call_reg(list : TAsmList;reg: tregister);override;
+
+        procedure a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);override;
+        procedure a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);override;
+
+        procedure a_op_const_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; a: aint; src, dst: tregister;setflags : boolean;var ovloc : tlocation);override;
+        procedure a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation);override;
+
+        procedure g_flags2reg(list: TAsmList; size: TCgSize; const f: TResFlags; reg: TRegister); override;
+
+        procedure g_proc_entry(list : TAsmList;localsize : longint;nostackframe:boolean);override;
+        procedure g_proc_exit(list : TAsmList;parasize : longint;nostackframe:boolean); override;
+
+        function handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference; override;
+      end;
+
+      tthumb2cg64farm = class(tcg64farm)
+        procedure a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);override;
+      end;
+
     const
     const
       OpCmp2AsmCond : Array[topcmp] of TAsmCond = (C_NONE,C_EQ,C_GT,
       OpCmp2AsmCond : Array[topcmp] of TAsmCond = (C_NONE,C_EQ,C_GT,
                            C_LT,C_GE,C_LE,C_NE,C_LS,C_CC,C_CS,C_HI);
                            C_LT,C_GE,C_LE,C_NE,C_LS,C_CC,C_CS,C_HI);
@@ -131,12 +159,14 @@ unit cgcpu;
       winstackpagesize = 4096;
       winstackpagesize = 4096;
 
 
     function get_fpu_postfix(def : tdef) : toppostfix;
     function get_fpu_postfix(def : tdef) : toppostfix;
+    procedure create_codegen;
 
 
   implementation
   implementation
 
 
 
 
     uses
     uses
        globals,verbose,systems,cutils,
        globals,verbose,systems,cutils,
+       aopt,aoptcpu,
        fmodule,
        fmodule,
        symconst,symsym,
        symconst,symsym,
        tgobj,
        tgobj,
@@ -164,7 +194,7 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-    procedure tcgarm.init_register_allocators;
+    procedure tarmcgarm.init_register_allocators;
       begin
       begin
         inherited init_register_allocators;
         inherited init_register_allocators;
         { currently, we save R14 always, so we can use it }
         { currently, we save R14 always, so we can use it }
@@ -184,7 +214,7 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-    procedure tcgarm.done_register_allocators;
+    procedure tarmcgarm.done_register_allocators;
       begin
       begin
         rg[R_INTREGISTER].free;
         rg[R_INTREGISTER].free;
         rg[R_FPUREGISTER].free;
         rg[R_FPUREGISTER].free;
@@ -193,6 +223,174 @@ unit cgcpu;
       end;
       end;
 
 
 
 
+     procedure tarmcgarm.a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);
+       var
+          imm_shift : byte;
+          l : tasmlabel;
+          hr : treference;
+       begin
+          if not(size in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
+            internalerror(2002090902);
+          if is_shifter_const(a,imm_shift) then
+            list.concat(taicpu.op_reg_const(A_MOV,reg,a))
+          else if is_shifter_const(not(a),imm_shift) then
+            list.concat(taicpu.op_reg_const(A_MVN,reg,not(a)))
+          { loading of constants with mov and orr }
+          else if (is_shifter_const(a-byte(a),imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-byte(a)));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,byte(a)));
+            end
+          else if (is_shifter_const(a-word(a),imm_shift)) and (is_shifter_const(word(a),imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-word(a)));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,word(a)));
+            end
+          else if (is_shifter_const(a-(dword(a) shl 8) shr 8,imm_shift)) and (is_shifter_const((dword(a) shl 8) shr 8,imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-(dword(a) shl 8) shr 8));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,(dword(a) shl 8) shr 8));
+            end
+          else
+            begin
+               reference_reset(hr,4);
+
+               current_asmdata.getjumplabel(l);
+               cg.a_label(current_procinfo.aktlocaldata,l);
+               hr.symboldata:=current_procinfo.aktlocaldata.last;
+               current_procinfo.aktlocaldata.concat(tai_const.Create_32bit(longint(a)));
+
+               hr.symbol:=l;
+               list.concat(taicpu.op_reg_ref(A_LDR,reg,hr));
+            end;
+       end;
+
+
+     procedure tarmcgarm.a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);
+       var
+         oppostfix:toppostfix;
+         usedtmpref: treference;
+         tmpreg,tmpreg2 : tregister;
+         so : tshifterop;
+         dir : integer;
+       begin
+         if (TCGSize2Size[FromSize] >= TCGSize2Size[ToSize]) then
+           FromSize := ToSize;
+         case FromSize of
+           { signed integer registers }
+           OS_8:
+             oppostfix:=PF_B;
+           OS_S8:
+             oppostfix:=PF_SB;
+           OS_16:
+             oppostfix:=PF_H;
+           OS_S16:
+             oppostfix:=PF_SH;
+           OS_32,
+           OS_S32:
+             oppostfix:=PF_None;
+           else
+             InternalError(200308297);
+         end;
+         if (ref.alignment in [1,2]) and (ref.alignment<tcgsize2size[fromsize]) then
+           begin
+             if target_info.endian=endian_big then
+               dir:=-1
+             else
+               dir:=1;
+             case FromSize of
+               OS_16,OS_S16:
+                 begin
+                   { only complicated references need an extra loadaddr }
+                   if assigned(ref.symbol) or
+                     (ref.index<>NR_NO) or
+                     (ref.offset<-4095) or
+                     (ref.offset>4094) or
+                     { sometimes the compiler reused registers }
+                     (reg=ref.index) or
+                     (reg=ref.base) then
+                     begin
+                       tmpreg2:=getintregister(list,OS_INT);
+                       a_loadaddr_ref_reg(list,ref,tmpreg2);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+                     end
+                   else
+                     usedtmpref:=ref;
+
+                   if target_info.endian=endian_big then
+                     inc(usedtmpref.offset,1);
+                   shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
+                   tmpreg:=getintregister(list,OS_INT);
+                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
+                   inc(usedtmpref.offset,dir);
+                   if FromSize=OS_16 then
+                     a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg)
+                   else
+                     a_internal_load_ref_reg(list,OS_S8,OS_S8,usedtmpref,tmpreg);
+                   list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                 end;
+               OS_32,OS_S32:
+                 begin
+                   tmpreg:=getintregister(list,OS_INT);
+
+                   { only complicated references need an extra loadaddr }
+                   if assigned(ref.symbol) or
+                     (ref.index<>NR_NO) or
+                     (ref.offset<-4095) or
+                     (ref.offset>4092) or
+                     { sometimes the compiler reused registers }
+                     (reg=ref.index) or
+                     (reg=ref.base) then
+                     begin
+                       tmpreg2:=getintregister(list,OS_INT);
+                       a_loadaddr_ref_reg(list,ref,tmpreg2);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+                     end
+                   else
+                     usedtmpref:=ref;
+
+                   shifterop_reset(so);so.shiftmode:=SM_LSL;
+                   if ref.alignment=2 then
+                     begin
+                       if target_info.endian=endian_big then
+                         inc(usedtmpref.offset,2);
+                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,reg);
+                       inc(usedtmpref.offset,dir*2);
+                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,tmpreg);
+                       so.shiftimm:=16;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                     end
+                   else
+                     begin
+                       if target_info.endian=endian_big then
+                         inc(usedtmpref.offset,3);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=8;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=16;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=24;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                     end;
+                 end
+               else
+                 handle_load_store(list,A_LDR,oppostfix,reg,ref);
+             end;
+           end
+         else
+           handle_load_store(list,A_LDR,oppostfix,reg,ref);
+
+         if (fromsize=OS_S8) and (tosize = OS_16) then
+           a_load_reg_reg(list,OS_16,OS_32,reg,reg);
+       end;
+
+
     procedure tcgarm.a_param_const(list : TAsmList;size : tcgsize;a : aint;const paraloc : TCGPara);
     procedure tcgarm.a_param_const(list : TAsmList;size : tcgsize;a : aint;const paraloc : TCGPara);
       var
       var
         ref: treference;
         ref: treference;
@@ -479,6 +677,17 @@ unit cgcpu;
                  list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
                  list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
               end;
               end;
             else
             else
+              {if (op in [OP_SUB, OP_ADD]) and
+                 ((a < 0) or
+                  (a > 4095)) then
+                begin
+                  tmpreg:=getintregister(list,size);
+                  list.concat(taicpu.op_reg_const(A_MOVT, tmpreg, (a shr 16) and $FFFF));
+                  list.concat(taicpu.op_reg_const(A_MOV, tmpreg, a and $FFFF));
+                  list.concat(setoppostfix(taicpu.op_reg_reg_reg(op_reg_reg_opcg2asmop[op],dst,src,tmpreg),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
+                   ));
+                end
+              else}
               list.concat(setoppostfix(
               list.concat(setoppostfix(
                   taicpu.op_reg_reg_const(op_reg_reg_opcg2asmop[op],dst,src,a),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
                   taicpu.op_reg_reg_const(op_reg_reg_opcg2asmop[op],dst,src,a),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
               ));
               ));
@@ -645,49 +854,6 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-     procedure tcgarm.a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);
-       var
-          imm_shift : byte;
-          l : tasmlabel;
-          hr : treference;
-       begin
-          if not(size in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
-            internalerror(2002090902);
-          if is_shifter_const(a,imm_shift) then
-            list.concat(taicpu.op_reg_const(A_MOV,reg,a))
-          else if is_shifter_const(not(a),imm_shift) then
-            list.concat(taicpu.op_reg_const(A_MVN,reg,not(a)))
-          { loading of constants with mov and orr }
-          else if (is_shifter_const(a-byte(a),imm_shift)) then
-            begin
-              list.concat(taicpu.op_reg_const(A_MOV,reg,a-byte(a)));
-              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,byte(a)));
-            end
-          else if (is_shifter_const(a-word(a),imm_shift)) and (is_shifter_const(word(a),imm_shift)) then
-            begin
-              list.concat(taicpu.op_reg_const(A_MOV,reg,a-word(a)));
-              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,word(a)));
-            end
-          else if (is_shifter_const(a-(dword(a) shl 8) shr 8,imm_shift)) and (is_shifter_const((dword(a) shl 8) shr 8,imm_shift)) then
-            begin
-              list.concat(taicpu.op_reg_const(A_MOV,reg,a-(dword(a) shl 8) shr 8));
-              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,(dword(a) shl 8) shr 8));
-            end
-          else
-            begin
-               reference_reset(hr,4);
-
-               current_asmdata.getjumplabel(l);
-               cg.a_label(current_procinfo.aktlocaldata,l);
-               hr.symboldata:=current_procinfo.aktlocaldata.last;
-               current_procinfo.aktlocaldata.concat(tai_const.Create_32bit(longint(a)));
-
-               hr.symbol:=l;
-               list.concat(taicpu.op_reg_ref(A_LDR,reg,hr));
-            end;
-       end;
-
-
     function tcgarm.handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference;
     function tcgarm.handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference;
       var
       var
         tmpreg : tregister;
         tmpreg : tregister;
@@ -922,138 +1088,13 @@ unit cgcpu;
        end;
        end;
 
 
 
 
-     procedure tcgarm.a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);
+     function tcgarm.a_internal_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference):treference;
        var
        var
          oppostfix:toppostfix;
          oppostfix:toppostfix;
-         usedtmpref: treference;
-         tmpreg,tmpreg2 : tregister;
-         so : tshifterop;
-         dir : integer;
        begin
        begin
-         if (TCGSize2Size[FromSize] >= TCGSize2Size[ToSize]) then
-           FromSize := ToSize;
-         case FromSize of
+         case ToSize of
            { signed integer registers }
            { signed integer registers }
-           OS_8:
-             oppostfix:=PF_B;
-           OS_S8:
-             oppostfix:=PF_SB;
-           OS_16:
-             oppostfix:=PF_H;
-           OS_S16:
-             oppostfix:=PF_SH;
-           OS_32,
-           OS_S32:
-             oppostfix:=PF_None;
-           else
-             InternalError(200308297);
-         end;
-         if (ref.alignment in [1,2]) and (ref.alignment<tcgsize2size[fromsize]) then
-           begin
-             if target_info.endian=endian_big then
-               dir:=-1
-             else
-               dir:=1;
-             case FromSize of
-               OS_16,OS_S16:
-                 begin
-                   { only complicated references need an extra loadaddr }
-                   if assigned(ref.symbol) or
-                     (ref.index<>NR_NO) or
-                     (ref.offset<-4095) or
-                     (ref.offset>4094) or
-                     { sometimes the compiler reused registers }
-                     (reg=ref.index) or
-                     (reg=ref.base) then
-                     begin
-                       tmpreg2:=getintregister(list,OS_INT);
-                       a_loadaddr_ref_reg(list,ref,tmpreg2);
-                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
-                     end
-                   else
-                     usedtmpref:=ref;
-
-                   if target_info.endian=endian_big then
-                     inc(usedtmpref.offset,1);
-                   shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
-                   tmpreg:=getintregister(list,OS_INT);
-                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
-                   inc(usedtmpref.offset,dir);
-                   if FromSize=OS_16 then
-                     a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg)
-                   else
-                     a_internal_load_ref_reg(list,OS_S8,OS_S8,usedtmpref,tmpreg);
-                   list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
-                 end;
-               OS_32,OS_S32:
-                 begin
-                   tmpreg:=getintregister(list,OS_INT);
-
-                   { only complicated references need an extra loadaddr }
-                   if assigned(ref.symbol) or
-                     (ref.index<>NR_NO) or
-                     (ref.offset<-4095) or
-                     (ref.offset>4092) or
-                     { sometimes the compiler reused registers }
-                     (reg=ref.index) or
-                     (reg=ref.base) then
-                     begin
-                       tmpreg2:=getintregister(list,OS_INT);
-                       a_loadaddr_ref_reg(list,ref,tmpreg2);
-                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
-                     end
-                   else
-                     usedtmpref:=ref;
-
-                   shifterop_reset(so);so.shiftmode:=SM_LSL;
-                   if ref.alignment=2 then
-                     begin
-                       if target_info.endian=endian_big then
-                         inc(usedtmpref.offset,2);
-                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,reg);
-                       inc(usedtmpref.offset,dir*2);
-                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,tmpreg);
-                       so.shiftimm:=16;
-                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
-                     end
-                   else
-                     begin
-                       if target_info.endian=endian_big then
-                         inc(usedtmpref.offset,3);
-                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
-                       inc(usedtmpref.offset,dir);
-                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
-                       so.shiftimm:=8;
-                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
-                       inc(usedtmpref.offset,dir);
-                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
-                       so.shiftimm:=16;
-                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
-                       inc(usedtmpref.offset,dir);
-                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
-                       so.shiftimm:=24;
-                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
-                     end;
-                 end
-               else
-                 handle_load_store(list,A_LDR,oppostfix,reg,ref);
-             end;
-           end
-         else
-           handle_load_store(list,A_LDR,oppostfix,reg,ref);
-
-         if (fromsize=OS_S8) and (tosize = OS_16) then
-           a_load_reg_reg(list,OS_16,OS_32,reg,reg);
-       end;
-
-
-     function tcgarm.a_internal_load_reg_ref(list : TAsmList; fromsize, tosize: tcgsize; reg : tregister;const ref : treference):treference;
-       var
-         oppostfix:toppostfix;
-       begin
-         case ToSize of
-           { signed integer registers }
-           OS_8,
+           OS_8,
            OS_S8:
            OS_S8:
              oppostfix:=PF_B;
              oppostfix:=PF_B;
            OS_16,
            OS_16,
@@ -2108,7 +2149,7 @@ unit cgcpu;
         if weak then
         if weak then
           current_asmdata.weakrefasmsymbol(s);
           current_asmdata.weakrefasmsymbol(s);
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
-        
+
         if not(cs_create_pic in current_settings.moduleswitches) then
         if not(cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$slp');
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$slp');
@@ -2123,7 +2164,7 @@ unit cgcpu;
           end
           end
         else
         else
           internalerror(2008100401);
           internalerror(2008100401);
-        
+
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_lazy_symbol_pointer,''));
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_lazy_symbol_pointer,''));
         current_asmdata.asmlists[al_imports].concat(Tai_symbol.Create(l1,0));
         current_asmdata.asmlists[al_imports].concat(Tai_symbol.Create(l1,0));
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
@@ -2357,7 +2398,881 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-begin
-  cg:=tcgarm.create;
-  cg64:=tcg64farm.create;
+    procedure Tthumb2cgarm.init_register_allocators;
+      begin
+        inherited init_register_allocators;
+        { currently, we save R14 always, so we can use it }
+        if (target_info.system<>system_arm_darwin) then
+          rg[R_INTREGISTER]:=trgcputhumb2.create(R_INTREGISTER,R_SUBWHOLE,
+              [RS_R0,RS_R1,RS_R2,RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
+               RS_R9,RS_R10,RS_R12,RS_R14],first_int_imreg,[])
+        else
+          { r9 is not available on Darwin according to the llvm code generator }
+          rg[R_INTREGISTER]:=trgcputhumb2.create(R_INTREGISTER,R_SUBWHOLE,
+              [RS_R0,RS_R1,RS_R2,RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
+               RS_R10,RS_R12,RS_R14],first_int_imreg,[]);
+        rg[R_FPUREGISTER]:=trgcputhumb2.create(R_FPUREGISTER,R_SUBNONE,
+            [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
+        rg[R_MMREGISTER]:=trgcputhumb2.create(R_MMREGISTER,R_SUBNONE,
+            [RS_S0,RS_S1,RS_R2,RS_R3,RS_R4,RS_S31],first_mm_imreg,[]);
+      end;
+
+
+    procedure Tthumb2cgarm.done_register_allocators;
+      begin
+        rg[R_INTREGISTER].free;
+        rg[R_FPUREGISTER].free;
+        rg[R_MMREGISTER].free;
+        inherited done_register_allocators;
+      end;
+
+
+    procedure Tthumb2cgarm.a_call_reg(list : TAsmList;reg: tregister);
+      begin
+        list.concat(taicpu.op_reg(A_BLX, reg));
+{
+        the compiler does not properly set this flag anymore in pass 1, and
+        for now we only need it after pass 2 (I hope) (JM)
+          if not(pi_do_call in current_procinfo.flags) then
+            internalerror(2003060703);
+}
+        include(current_procinfo.flags,pi_do_call);
+      end;
+
+
+     procedure Tthumb2cgarm.a_load_const_reg(list : TAsmList; size: tcgsize; a : aint;reg : tregister);
+       var
+          imm_shift : byte;
+          l : tasmlabel;
+          hr : treference;
+       begin
+          if not(size in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
+            internalerror(2002090902);
+          if is_shifter_const(a,imm_shift) then
+            list.concat(taicpu.op_reg_const(A_MOV,reg,a))
+          { loading of constants with mov and orr }
+          else if (is_shifter_const(a-byte(a),imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-byte(a)));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,byte(a)));
+            end
+          else if (is_shifter_const(a-word(a),imm_shift)) and (is_shifter_const(word(a),imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-word(a)));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,word(a)));
+            end
+          else if (is_shifter_const(a-(dword(a) shl 8) shr 8,imm_shift)) and (is_shifter_const((dword(a) shl 8) shr 8,imm_shift)) then
+            begin
+              list.concat(taicpu.op_reg_const(A_MOV,reg,a-(dword(a) shl 8) shr 8));
+              list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,(dword(a) shl 8) shr 8));
+            end
+          else
+            begin
+               reference_reset(hr,4);
+
+               current_asmdata.getjumplabel(l);
+               cg.a_label(current_procinfo.aktlocaldata,l);
+               hr.symboldata:=current_procinfo.aktlocaldata.last;
+               current_procinfo.aktlocaldata.concat(tai_const.Create_32bit(longint(a)));
+
+               hr.symbol:=l;
+               list.concat(taicpu.op_reg_ref(A_LDR,reg,hr));
+            end;
+       end;
+
+
+     procedure Tthumb2cgarm.a_load_ref_reg(list : TAsmList; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);
+       var
+         oppostfix:toppostfix;
+         usedtmpref: treference;
+         tmpreg,tmpreg2 : tregister;
+         so : tshifterop;
+         dir : integer;
+       begin
+         if (TCGSize2Size[FromSize] >= TCGSize2Size[ToSize]) then
+           FromSize := ToSize;
+         case FromSize of
+           { signed integer registers }
+           OS_8:
+             oppostfix:=PF_B;
+           OS_S8:
+             oppostfix:=PF_SB;
+           OS_16:
+             oppostfix:=PF_H;
+           OS_S16:
+             oppostfix:=PF_SH;
+           OS_32,
+           OS_S32:
+             oppostfix:=PF_None;
+           else
+             InternalError(200308297);
+         end;
+         if (ref.alignment in [1,2]) and (ref.alignment<tcgsize2size[fromsize]) then
+           begin
+             if target_info.endian=endian_big then
+               dir:=-1
+             else
+               dir:=1;
+             case FromSize of
+               OS_16,OS_S16:
+                 begin
+                   { only complicated references need an extra loadaddr }
+                   if assigned(ref.symbol) or
+                     (ref.index<>NR_NO) or
+                     (ref.offset<-255) or
+                     (ref.offset>4094) or
+                     { sometimes the compiler reused registers }
+                     (reg=ref.index) or
+                     (reg=ref.base) then
+                     begin
+                       tmpreg2:=getintregister(list,OS_INT);
+                       a_loadaddr_ref_reg(list,ref,tmpreg2);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+                     end
+                   else
+                     usedtmpref:=ref;
+
+                   if target_info.endian=endian_big then
+                     inc(usedtmpref.offset,1);
+                   shifterop_reset(so);so.shiftmode:=SM_LSL;so.shiftimm:=8;
+                   tmpreg:=getintregister(list,OS_INT);
+                   a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
+                   inc(usedtmpref.offset,dir);
+                   if FromSize=OS_16 then
+                     a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg)
+                   else
+                     a_internal_load_ref_reg(list,OS_S8,OS_S8,usedtmpref,tmpreg);
+                   list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                 end;
+               OS_32,OS_S32:
+                 begin
+                   tmpreg:=getintregister(list,OS_INT);
+
+                   { only complicated references need an extra loadaddr }
+                   if assigned(ref.symbol) or
+                     (ref.index<>NR_NO) or
+                     (ref.offset<-255) or
+                     (ref.offset>4092) or
+                     { sometimes the compiler reused registers }
+                     (reg=ref.index) or
+                     (reg=ref.base) then
+                     begin
+                       tmpreg2:=getintregister(list,OS_INT);
+                       a_loadaddr_ref_reg(list,ref,tmpreg2);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+                     end
+                   else
+                     usedtmpref:=ref;
+
+                   shifterop_reset(so);so.shiftmode:=SM_LSL;
+                   if ref.alignment=2 then
+                     begin
+                       if target_info.endian=endian_big then
+                         inc(usedtmpref.offset,2);
+                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,reg);
+                       inc(usedtmpref.offset,dir*2);
+                       a_internal_load_ref_reg(list,OS_16,OS_16,usedtmpref,tmpreg);
+                       so.shiftimm:=16;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                     end
+                   else
+                     begin
+                       if target_info.endian=endian_big then
+                         inc(usedtmpref.offset,3);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,reg);
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=8;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=16;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                       inc(usedtmpref.offset,dir);
+                       a_internal_load_ref_reg(list,OS_8,OS_8,usedtmpref,tmpreg);
+                       so.shiftimm:=24;
+                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ORR,reg,reg,tmpreg,so));
+                     end;
+                 end
+               else
+                 handle_load_store(list,A_LDR,oppostfix,reg,ref);
+             end;
+           end
+         else
+           handle_load_store(list,A_LDR,oppostfix,reg,ref);
+
+         if (fromsize=OS_S8) and (tosize = OS_16) then
+           a_load_reg_reg(list,OS_16,OS_32,reg,reg);
+       end;
+
+
+    procedure Tthumb2cgarm.a_op_const_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; a: aint; src, dst: tregister;setflags : boolean;var ovloc : tlocation);
+      var
+        shift : byte;
+        tmpreg : tregister;
+        so : tshifterop;
+        l1 : longint;
+      begin
+        ovloc.loc:=LOC_VOID;
+        if {$ifopt R+}(a<>-2147483648) and{$endif} is_shifter_const(-a,shift) then
+          case op of
+            OP_ADD:
+              begin
+                op:=OP_SUB;
+                a:=aint(dword(-a));
+              end;
+            OP_SUB:
+              begin
+                op:=OP_ADD;
+                a:=aint(dword(-a));
+              end
+          end;
+
+        if is_shifter_const(a,shift) and not(op in [OP_IMUL,OP_MUL]) then
+          case op of
+            OP_NEG,OP_NOT,
+            OP_DIV,OP_IDIV:
+              internalerror(200308281);
+            OP_SHL:
+              begin
+                if a>32 then
+                  internalerror(200308294);
+                if a<>0 then
+                  begin
+                    shifterop_reset(so);
+                    so.shiftmode:=SM_LSL;
+                    so.shiftimm:=a;
+                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,dst,src,so));
+                  end
+                else
+                 list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
+              end;
+            OP_ROL:
+              begin
+                if a>32 then
+                  internalerror(200308294);
+                if a<>0 then
+                  begin
+                    shifterop_reset(so);
+                    so.shiftmode:=SM_ROR;
+                    so.shiftimm:=32-a;
+                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,dst,src,so));
+                  end
+                else
+                 list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
+              end;
+            OP_ROR:
+              begin
+                if a>32 then
+                  internalerror(200308294);
+                if a<>0 then
+                  begin
+                    shifterop_reset(so);
+                    so.shiftmode:=SM_ROR;
+                    so.shiftimm:=a;
+                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,dst,src,so));
+                  end
+                else
+                 list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
+              end;
+            OP_SHR:
+              begin
+                if a>32 then
+                  internalerror(200308292);
+                shifterop_reset(so);
+                if a<>0 then
+                  begin
+                    so.shiftmode:=SM_LSR;
+                    so.shiftimm:=a;
+                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,dst,src,so));
+                  end
+                else
+                 list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
+              end;
+            OP_SAR:
+              begin
+                if a>32 then
+                  internalerror(200308295);
+                if a<>0 then
+                  begin
+                    shifterop_reset(so);
+                    so.shiftmode:=SM_ASR;
+                    so.shiftimm:=a;
+                    list.concat(taicpu.op_reg_reg_shifterop(A_MOV,dst,src,so));
+                  end
+                else
+                 list.concat(taicpu.op_reg_reg(A_MOV,dst,src));
+              end;
+            else
+              if (op in [OP_SUB, OP_ADD]) and
+                 ((a < 0) or
+                  (a > 4095)) then
+                begin
+                  tmpreg:=getintregister(list,size);
+                  a_load_const_reg(list, size, a, tmpreg);
+                  list.concat(setoppostfix(taicpu.op_reg_reg_reg(op_reg_reg_opcg2asmop[op],dst,src,tmpreg),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
+                   ));
+                end
+              else
+              list.concat(setoppostfix(
+                  taicpu.op_reg_reg_const(op_reg_reg_opcg2asmop[op],dst,src,a),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
+              ));
+              if (cgsetflags or setflags) and (size in [OS_8,OS_16,OS_32]) then
+                begin
+                  ovloc.loc:=LOC_FLAGS;
+                  case op of
+                    OP_ADD:
+                      ovloc.resflags:=F_CS;
+                    OP_SUB:
+                      ovloc.resflags:=F_CC;
+                  end;
+                end;
+          end
+        else
+          begin
+            { there could be added some more sophisticated optimizations }
+            if (op in [OP_MUL,OP_IMUL]) and (a=1) then
+              a_load_reg_reg(list,size,size,src,dst)
+            else if (op in [OP_MUL,OP_IMUL]) and (a=0) then
+              a_load_const_reg(list,size,0,dst)
+            else if (op in [OP_IMUL]) and (a=-1) then
+              a_op_reg_reg(list,OP_NEG,size,src,dst)
+            { we do this here instead in the peephole optimizer because
+              it saves us a register }
+            else if (op in [OP_MUL,OP_IMUL]) and ispowerof2(a,l1) and not(cgsetflags or setflags) then
+              a_op_const_reg_reg(list,OP_SHL,size,l1,src,dst)
+            { for example : b=a*5 -> b=a*4+a with add instruction and shl }
+            else if (op in [OP_MUL,OP_IMUL]) and ispowerof2(a-1,l1) and not(cgsetflags or setflags) then
+              begin
+                if l1>32 then{roozbeh does this ever happen?}
+                  internalerror(200308296);
+                shifterop_reset(so);
+                so.shiftmode:=SM_LSL;
+                so.shiftimm:=l1;
+                list.concat(taicpu.op_reg_reg_reg_shifterop(A_ADD,dst,src,src,so));
+              end
+            else
+              begin
+                tmpreg:=getintregister(list,size);
+                a_load_const_reg(list,size,a,tmpreg);
+                a_op_reg_reg_reg_checkoverflow(list,op,size,tmpreg,src,dst,setflags,ovloc);
+              end;
+          end;
+        maybeadjustresult(list,op,size,dst);
+      end;
+
+
+    const
+      op_reg_reg_opcg2asmopThumb2: array[TOpCG] of tasmop =
+        (A_NONE,A_MOV,A_ADD,A_AND,A_UDIV,A_SDIV,A_MUL,A_MUL,A_NONE,A_MVN,A_ORR,
+         A_ASR,A_LSL,A_LSR,A_SUB,A_EOR,A_NONE,A_ROR);
+
+
+    procedure Tthumb2cgarm.a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation);
+      var
+        so : tshifterop;
+        tmpreg,overflowreg : tregister;
+        asmop : tasmop;
+      begin
+        ovloc.loc:=LOC_VOID;
+        case op of
+           OP_NEG,OP_NOT,
+           OP_DIV,OP_IDIV:
+              internalerror(200308281);
+           OP_ROL:
+              begin
+                if not(size in [OS_32,OS_S32]) then
+                   internalerror(2008072801);
+                { simulate ROL by ror'ing 32-value }
+                tmpreg:=getintregister(list,OS_32);
+                list.concat(taicpu.op_reg_const(A_MOV,tmpreg,32));
+                list.concat(taicpu.op_reg_reg_reg(A_SUB,src1,tmpreg,src1));
+                list.concat(taicpu.op_reg_reg_reg(A_ROR, dst, src2, src1));
+              end;
+           OP_ROR:
+              begin
+                if not(size in [OS_32,OS_S32]) then
+                   internalerror(2008072802);
+                list.concat(taicpu.op_reg_reg_reg(A_ROR, dst, src2, src1));
+              end;
+           OP_IMUL,
+           OP_MUL:
+              begin
+                if cgsetflags or setflags then
+                   begin
+                      overflowreg:=getintregister(list,size);
+                      if op=OP_IMUL then
+                        asmop:=A_SMULL
+                      else
+                        asmop:=A_UMULL;
+                      { the arm doesn't allow that rd and rm are the same }
+                      if dst=src2 then
+                        begin
+                           if dst<>src1 then
+                              list.concat(taicpu.op_reg_reg_reg_reg(asmop,dst,overflowreg,src1,src2))
+                           else
+                              begin
+                                tmpreg:=getintregister(list,size);
+                                a_load_reg_reg(list,size,size,src2,dst);
+                                list.concat(taicpu.op_reg_reg_reg_reg(asmop,dst,overflowreg,tmpreg,src1));
+                              end;
+                        end
+                      else
+                        list.concat(taicpu.op_reg_reg_reg_reg(asmop,dst,overflowreg,src2,src1));
+                      if op=OP_IMUL then
+                        begin
+                           shifterop_reset(so);
+                           so.shiftmode:=SM_ASR;
+                           so.shiftimm:=31;
+                           list.concat(taicpu.op_reg_reg_shifterop(A_CMP,overflowreg,dst,so));
+                        end
+                      else
+                        list.concat(taicpu.op_reg_const(A_CMP,overflowreg,0));
+
+                       ovloc.loc:=LOC_FLAGS;
+                       ovloc.resflags:=F_NE;
+                   end
+                else
+                   begin
+                      { the arm doesn't allow that rd and rm are the same }
+                      if dst=src2 then
+                        begin
+                           if dst<>src1 then
+                              list.concat(taicpu.op_reg_reg_reg(A_MUL,dst,src1,src2))
+                           else
+                              begin
+                                tmpreg:=getintregister(list,size);
+                                a_load_reg_reg(list,size,size,src2,dst);
+                                list.concat(taicpu.op_reg_reg_reg(A_MUL,dst,tmpreg,src1));
+                              end;
+                        end
+                      else
+                        list.concat(taicpu.op_reg_reg_reg(A_MUL,dst,src2,src1));
+                   end;
+              end;
+           else
+              list.concat(setoppostfix(
+                   taicpu.op_reg_reg_reg(op_reg_reg_opcg2asmopThumb2[op],dst,src2,src1),toppostfix(ord(cgsetflags or setflags)*ord(PF_S))
+                ));
+        end;
+        maybeadjustresult(list,op,size,dst);
+      end;
+
+
+    procedure Tthumb2cgarm.g_flags2reg(list: TAsmList; size: TCgSize; const f: TResFlags; reg: TRegister);
+      var item: taicpu;
+      begin
+        item := setcondition(taicpu.op_reg_const(A_MOV,reg,1),flags_to_cond(f));
+        list.concat(item);
+        list.insertbefore(taicpu.op_cond(A_IT, flags_to_cond(f)), item);
+
+        item := setcondition(taicpu.op_reg_const(A_MOV,reg,0),inverse_cond(flags_to_cond(f)));
+        list.concat(item);
+        list.insertbefore(taicpu.op_cond(A_IT, inverse_cond(flags_to_cond(f))), item);
+      end;
+
+
+    procedure Tthumb2cgarm.g_proc_entry(list : TAsmList;localsize : longint;nostackframe:boolean);
+      var
+         ref : treference;
+         shift : byte;
+         firstfloatreg,lastfloatreg,
+         r : byte;
+         regs : tcpuregisterset;
+         stackmisalignment: pint;
+      begin
+        LocalSize:=align(LocalSize,4);
+        { call instruction does not put anything on the stack }
+        stackmisalignment:=0;
+        if not(nostackframe) then
+          begin
+            firstfloatreg:=RS_NO;
+            { save floating point registers? }
+            for r:=RS_F0 to RS_F7 do
+              if r in rg[R_FPUREGISTER].used_in_proc-paramanager.get_volatile_registers_fpu(pocall_stdcall) then
+                begin
+                  if firstfloatreg=RS_NO then
+                    firstfloatreg:=r;
+                  lastfloatreg:=r;
+                  inc(stackmisalignment,12);
+                end;
+
+            a_reg_alloc(list,NR_STACK_POINTER_REG);
+            if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
+              begin
+                a_reg_alloc(list,NR_FRAME_POINTER_REG);
+                a_reg_alloc(list,NR_R12);
+
+                list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
+              end;
+            { save int registers }
+            reference_reset(ref,4);
+            ref.index:=NR_STACK_POINTER_REG;
+            ref.addressmode:=AM_PREINDEXED;
+
+            regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
+
+            if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
+              regs:=regs+[RS_R11,RS_R14]
+            else if (regs<>[]) or (pi_do_call in current_procinfo.flags) then
+              include(regs,RS_R14);
+
+            if regs<>[] then
+              begin
+                for r:=RS_R0 to RS_R15 do
+                  if (r in regs) then
+                    inc(stackmisalignment,4);
+                list.concat(setoppostfix(taicpu.op_ref_regset(A_STM,ref,regs),PF_FD));
+              end;
+
+            if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
+              list.concat(taicpu.op_reg_reg(A_MOV,NR_FRAME_POINTER_REG,NR_R12));
+
+            stackmisalignment:=stackmisalignment mod current_settings.alignment.localalignmax;
+            if (LocalSize<>0) or
+               ((stackmisalignment<>0) and
+                ((pi_do_call in current_procinfo.flags) or
+                 (po_assembler in current_procinfo.procdef.procoptions))) then
+              begin
+                localsize:=align(localsize+stackmisalignment,current_settings.alignment.localalignmax)-stackmisalignment;
+                if not(is_shifter_const(localsize,shift)) then
+                  begin
+                    if current_procinfo.framepointer=NR_STACK_POINTER_REG then
+                      a_reg_alloc(list,NR_R12);
+                    a_load_const_reg(list,OS_ADDR,LocalSize,NR_R12);
+                    list.concat(taicpu.op_reg_reg_reg(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,NR_R12));
+                    a_reg_dealloc(list,NR_R12);
+                  end
+                else
+                  begin
+                    a_reg_dealloc(list,NR_R12);
+                    list.concat(taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,LocalSize));
+                  end;
+              end;
+
+            if firstfloatreg<>RS_NO then
+              begin
+                reference_reset(ref,4);
+                if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
+                  begin
+                    a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
+                    list.concat(taicpu.op_reg_reg_reg(A_SUB,NR_R12,current_procinfo.framepointer,NR_R12));
+                    ref.base:=NR_R12;
+                  end
+                else
+                  begin
+                    ref.base:=current_procinfo.framepointer;
+                    ref.offset:=tarmprocinfo(current_procinfo).floatregstart;
+                  end;
+                list.concat(taicpu.op_reg_const_ref(A_SFM,newreg(R_FPUREGISTER,firstfloatreg,R_SUBWHOLE),
+                  lastfloatreg-firstfloatreg+1,ref));
+              end;
+          end;
+      end;
+
+
+    procedure Tthumb2cgarm.g_proc_exit(list : TAsmList;parasize : longint;nostackframe:boolean);
+      var
+         ref : treference;
+         firstfloatreg,lastfloatreg,
+         r : byte;
+         shift : byte;
+         regs : tcpuregisterset;
+         LocalSize : longint;
+         stackmisalignment: pint;
+      begin
+        if not(nostackframe) then
+          begin
+            stackmisalignment:=0;
+            { restore floating point register }
+            firstfloatreg:=RS_NO;
+            { save floating point registers? }
+            for r:=RS_F0 to RS_F7 do
+              if r in rg[R_FPUREGISTER].used_in_proc-paramanager.get_volatile_registers_fpu(pocall_stdcall) then
+                begin
+                  if firstfloatreg=RS_NO then
+                    firstfloatreg:=r;
+                  lastfloatreg:=r;
+                  { floating point register space is already included in
+                    localsize below by calc_stackframe_size
+                   inc(stackmisalignment,12);
+                  }
+                end;
+
+            if firstfloatreg<>RS_NO then
+              begin
+                reference_reset(ref,4);
+                if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
+                  begin
+                    a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
+                    list.concat(taicpu.op_reg_reg_reg(A_SUB,NR_R12,current_procinfo.framepointer,NR_R12));
+                    ref.base:=NR_R12;
+                  end
+                else
+                  begin
+                    ref.base:=current_procinfo.framepointer;
+                    ref.offset:=tarmprocinfo(current_procinfo).floatregstart;
+                  end;
+                list.concat(taicpu.op_reg_const_ref(A_LFM,newreg(R_FPUREGISTER,firstfloatreg,R_SUBWHOLE),
+                  lastfloatreg-firstfloatreg+1,ref));
+              end;
+
+            regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
+            if (pi_do_call in current_procinfo.flags) or (regs<>[]) then
+              begin
+                exclude(regs,RS_R14);
+                include(regs,RS_R15);
+              end;
+            if (current_procinfo.framepointer<>NR_STACK_POINTER_REG) then
+              regs:=regs+[RS_R11,RS_R15];
+
+            for r:=RS_R0 to RS_R15 do
+              if (r in regs) then
+                inc(stackmisalignment,4);
+
+            stackmisalignment:=stackmisalignment mod current_settings.alignment.localalignmax;
+            if (current_procinfo.framepointer=NR_STACK_POINTER_REG) then
+              begin
+                LocalSize:=current_procinfo.calc_stackframe_size;
+                if (LocalSize<>0) or
+                   ((stackmisalignment<>0) and
+                    ((pi_do_call in current_procinfo.flags) or
+                     (po_assembler in current_procinfo.procdef.procoptions))) then
+                  begin
+                    localsize:=align(localsize+stackmisalignment,current_settings.alignment.localalignmax)-stackmisalignment;
+                    if not(is_shifter_const(LocalSize,shift)) then
+                      begin
+                        a_reg_alloc(list,NR_R12);
+                        a_load_const_reg(list,OS_ADDR,LocalSize,NR_R12);
+                        list.concat(taicpu.op_reg_reg_reg(A_ADD,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,NR_R12));
+                        a_reg_dealloc(list,NR_R12);
+                      end
+                    else
+                      begin
+                        list.concat(taicpu.op_reg_reg_const(A_ADD,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,LocalSize));
+                      end;
+                  end;
+
+                if regs=[] then
+                  list.concat(taicpu.op_reg_reg(A_MOV,NR_R15,NR_R14))
+                else
+                  begin
+                    reference_reset(ref,4);
+                    ref.index:=NR_STACK_POINTER_REG;
+                    ref.addressmode:=AM_PREINDEXED;
+                    list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,regs),PF_FD));
+                  end;
+              end
+            else
+              begin
+                { restore int registers and return }
+                list.concat(taicpu.op_reg_reg(A_MOV, NR_STACK_POINTER_REG, NR_R11));
+                
+                reference_reset(ref,4);
+                ref.index:=NR_STACK_POINTER_REG;
+                list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,regs),PF_DB));
+              end;
+          end
+        else
+          list.concat(taicpu.op_reg_reg(A_MOV,NR_PC,NR_R14));
+      end;
+
+
+   function Tthumb2cgarm.handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference;
+      var
+        tmpreg : tregister;
+        tmpref : treference;
+        l : tasmlabel;
+        so: tshifterop;
+      begin
+        tmpreg:=NR_NO;
+
+        { Be sure to have a base register }
+        if (ref.base=NR_NO) then
+          begin
+            if ref.shiftmode<>SM_None then
+              internalerror(200308294);
+            ref.base:=ref.index;
+            ref.index:=NR_NO;
+          end;
+
+        { absolute symbols can't be handled directly, we've to store the symbol reference
+          in the text segment and access it pc relative
+
+          For now, we assume that references where base or index equals to PC are already
+          relative, all other references are assumed to be absolute and thus they need
+          to be handled extra.
+
+          A proper solution would be to change refoptions to a set and store the information
+          if the symbol is absolute or relative there.
+        }
+
+        if (assigned(ref.symbol) and
+            not(is_pc(ref.base)) and
+            not(is_pc(ref.index))
+           ) or
+           { [#xxx] isn't a valid address operand }
+           ((ref.base=NR_NO) and (ref.index=NR_NO)) or
+           //(ref.offset<-4095) or
+           (ref.offset<-255) or
+           (ref.offset>4095) or
+           ((oppostfix in [PF_SB,PF_H,PF_SH]) and
+            ((ref.offset<-255) or
+             (ref.offset>255)
+            )
+           ) or
+           ((op in [A_LDF,A_STF]) and
+            ((ref.offset<-1020) or
+             (ref.offset>1020) or
+             { the usual pc relative symbol handling assumes possible offsets of +/- 4095 }
+             assigned(ref.symbol)
+            )
+           ) then
+          begin
+            reference_reset(tmpref,4);
+
+            { load symbol }
+            tmpreg:=getintregister(list,OS_INT);
+            if assigned(ref.symbol) then
+              begin
+                current_asmdata.getjumplabel(l);
+                cg.a_label(current_procinfo.aktlocaldata,l);
+                tmpref.symboldata:=current_procinfo.aktlocaldata.last;
+
+                current_procinfo.aktlocaldata.concat(tai_const.create_sym_offset(ref.symbol,ref.offset));
+
+                { load consts entry }
+                tmpref.symbol:=l;
+                tmpref.base:=NR_R15;
+                list.concat(taicpu.op_reg_ref(A_LDR,tmpreg,tmpref));
+
+                { in case of LDF/STF, we got rid of the NR_R15 }
+                if is_pc(ref.base) then
+                  ref.base:=NR_NO;
+                if is_pc(ref.index) then
+                  ref.index:=NR_NO;
+              end
+            else
+              a_load_const_reg(list,OS_ADDR,ref.offset,tmpreg);
+
+            if (ref.base<>NR_NO) then
+              begin
+                if ref.index<>NR_NO then
+                  begin
+                    list.concat(taicpu.op_reg_reg_reg(A_ADD,tmpreg,ref.base,tmpreg));
+                    ref.base:=tmpreg;
+                  end
+                else
+                  begin
+                    ref.index:=tmpreg;
+                    ref.shiftimm:=0;
+                    ref.signindex:=1;
+                    ref.shiftmode:=SM_None;
+                  end;
+              end
+            else
+              ref.base:=tmpreg;
+            ref.offset:=0;
+            ref.symbol:=nil;
+          end;
+
+        if (ref.base<>NR_NO) and (ref.index<>NR_NO) and (ref.offset<>0) then
+          begin
+            if tmpreg<>NR_NO then
+              a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,tmpreg,tmpreg)
+            else
+              begin
+                tmpreg:=getintregister(list,OS_ADDR);
+                a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,tmpreg);
+                ref.base:=tmpreg;
+              end;
+            ref.offset:=0;
+          end;
+
+        { Hack? Thumb2 doesn't allow PC indexed addressing modes(although it does in the specification) }
+        if (ref.base=NR_R15) and (ref.index<>NR_NO) and (ref.shiftmode <> sm_none) then
+          begin
+            tmpreg:=getintregister(list,OS_ADDR);
+
+            list.concat(taicpu.op_reg_reg(A_MOV, tmpreg, NR_R15));
+        
+            ref.base := tmpreg;
+          end;
+
+        { floating point operations have only limited references
+          we expect here, that a base is already set }
+        if (op in [A_LDF,A_STF]) and (ref.index<>NR_NO) then
+          begin
+            if ref.shiftmode<>SM_none then
+              internalerror(200309121);
+            if tmpreg<>NR_NO then
+              begin
+                if ref.base=tmpreg then
+                  begin
+                    if ref.signindex<0 then
+                      list.concat(taicpu.op_reg_reg_reg(A_SUB,tmpreg,tmpreg,ref.index))
+                    else
+                      list.concat(taicpu.op_reg_reg_reg(A_ADD,tmpreg,tmpreg,ref.index));
+                    ref.index:=NR_NO;
+                  end
+                else
+                  begin
+                    if ref.index<>tmpreg then
+                      internalerror(200403161);
+                    if ref.signindex<0 then
+                      list.concat(taicpu.op_reg_reg_reg(A_SUB,tmpreg,ref.base,tmpreg))
+                    else
+                      list.concat(taicpu.op_reg_reg_reg(A_ADD,tmpreg,ref.base,tmpreg));
+                    ref.base:=tmpreg;
+                    ref.index:=NR_NO;
+                  end;
+              end
+            else
+              begin
+                tmpreg:=getintregister(list,OS_ADDR);
+                list.concat(taicpu.op_reg_reg_reg(A_ADD,tmpreg,ref.base,ref.index));
+                ref.base:=tmpreg;
+                ref.index:=NR_NO;
+              end;
+          end;
+        list.concat(setoppostfix(taicpu.op_reg_ref(op,reg,ref),oppostfix));
+        Result := ref;
+      end;
+
+
+    procedure tthumb2cg64farm.a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);
+      var tmpreg: tregister;
+      begin
+        case op of
+          OP_NEG:
+            begin
+              list.concat(setoppostfix(taicpu.op_reg_reg_const(A_RSB,regdst.reglo,regsrc.reglo,0),PF_S));
+              tmpreg:=cg.getintregister(list,OS_32);
+              list.concat(taicpu.op_reg_const(A_MOV,tmpreg,0));
+              list.concat(taicpu.op_reg_reg_reg(A_SBC,regdst.reghi,tmpreg,regsrc.reghi));
+            end;
+          else
+            inherited a_op64_reg_reg(list, op, size, regsrc, regdst);
+        end;
+      end;
+
+
+    procedure create_codegen;
+      begin
+        if current_settings.cputype in cpu_thumb2 then
+          begin
+            cg:=tthumb2cgarm.create;
+            cg64:=tthumb2cg64farm.create;
+
+            casmoptimizer:=TCpuThumb2AsmOptimizer;
+          end
+        else
+          begin
+            cg:=tarmcgarm.create;
+            cg64:=tcg64farm.create;
+
+            casmoptimizer:=TCpuAsmOptimizer;
+          end;
+      end;
+
 end.
 end.

+ 25 - 10
compiler/arm/cpubase.pas

@@ -503,16 +503,31 @@ unit cpubase;
       var
       var
          i : longint;
          i : longint;
       begin
       begin
-         for i:=0 to 15 do
-           begin
-              if (dword(d) and not(rotl($ff,i*2)))=0 then
-                begin
-                   imm_shift:=i*2;
-                   result:=true;
-                   exit;
-                end;
-           end;
-         result:=false;
+        if current_settings.cputype in cpu_thumb2 then
+          begin
+            for i:=0 to 24 do
+              begin
+                 if (dword(d) and not($ff shl i))=0 then
+                   begin
+                     imm_shift:=i;
+                     result:=true;
+                     exit;
+                   end;
+              end;
+          end
+        else
+          begin
+            for i:=0 to 15 do
+              begin
+                 if (dword(d) and not(rotl($ff,i*2)))=0 then
+                   begin
+                      imm_shift:=i*2;
+                      result:=true;
+                      exit;
+                   end;
+              end;
+          end;
+        result:=false;
       end;
       end;
 
 
 
 

+ 21 - 6
compiler/arm/cpuinfo.pas

@@ -34,9 +34,17 @@ Type
       (cpu_none,
       (cpu_none,
        cpu_armv3,
        cpu_armv3,
        cpu_armv4,
        cpu_armv4,
-       cpu_armv5
+       cpu_armv5,
+       cpu_armv7m,
+       cpu_cortexm3
       );
       );
 
 
+Const
+   cpu_arm = [cpu_none,cpu_armv3,cpu_armv4,cpu_armv5];
+   cpu_thumb = [];
+   cpu_thumb2 = [cpu_armv7m,cpu_cortexm3];
+
+Type
    tfputype =
    tfputype =
      (fpu_none,
      (fpu_none,
       fpu_soft,
       fpu_soft,
@@ -59,7 +67,10 @@ Type
       ct_at91sam7s256,
       ct_at91sam7s256,
       ct_at91sam7se256,
       ct_at91sam7se256,
       ct_at91sam7x256,
       ct_at91sam7x256,
-      ct_at91sam7xc256
+      ct_at91sam7xc256,
+		
+      { STMicroelectronics }
+      ct_stm32f103re
      );
      );
 
 
 Const
 Const
@@ -83,10 +94,12 @@ Const
      pocall_softfloat
      pocall_softfloat
    ];
    ];
 
 
-   cputypestr : array[tcputype] of string[5] = ('',
+   cputypestr : array[tcputype] of string[8] = ('',
      'ARMV3',
      'ARMV3',
      'ARMV4',
      'ARMV4',
-     'ARMV5'
+     'ARMV5',
+     'ARMV7M',
+     'CORTEXM3'
    );
    );
 
 
    fputypestr : array[tfputype] of string[6] = ('',
    fputypestr : array[tfputype] of string[6] = ('',
@@ -106,7 +119,8 @@ Const
       'AT91SAM7S256',
       'AT91SAM7S256',
       'AT91SAM7SE256',
       'AT91SAM7SE256',
       'AT91SAM7X256',
       'AT91SAM7X256',
-      'AT91SAM7XC256'
+      'AT91SAM7XC256',
+      'STM32F103RE'
      );
      );
 
 
    controllerunitstr : array[tcontrollertype] of string[20] =
    controllerunitstr : array[tcontrollertype] of string[20] =
@@ -117,7 +131,8 @@ Const
       'AT91SAM7x256',
       'AT91SAM7x256',
       'AT91SAM7x256',
       'AT91SAM7x256',
       'AT91SAM7x256',
       'AT91SAM7x256',
-      'AT91SAM7x256'
+      'AT91SAM7x256',
+      'STM32F103'
      );
      );
 
 
    { Supported optimizations, only used for information }
    { Supported optimizations, only used for information }

+ 2 - 0
compiler/arm/narmadd.pas

@@ -257,6 +257,8 @@ interface
             location_reset(location,LOC_FLAGS,OS_NO);
             location_reset(location,LOC_FLAGS,OS_NO);
             location.resflags:=getresflags(unsigned);
             location.resflags:=getresflags(unsigned);
             current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_CMP,left.location.register64.reghi,right.location.register64.reghi));
             current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_CMP,left.location.register64.reghi,right.location.register64.reghi));
+            if current_settings.cputype in cpu_thumb2 then
+              current_asmdata.CurrAsmList.concat(taicpu.op_cond(A_IT, C_EQ));
             current_asmdata.CurrAsmList.concat(setcondition(taicpu.op_reg_reg(A_CMP,left.location.register64.reglo,right.location.register64.reglo),C_EQ));
             current_asmdata.CurrAsmList.concat(setcondition(taicpu.op_reg_reg(A_CMP,left.location.register64.reglo,right.location.register64.reglo),C_EQ));
           end
           end
         else
         else

+ 33 - 0
compiler/arm/raarmgas.pas

@@ -645,6 +645,32 @@ Unit raarmgas;
           end;
           end;
 
 
 
 
+        function is_ConditionCode(hs: string): boolean;
+          var icond: tasmcond;
+          begin
+            is_ConditionCode := false;
+            
+            if actopcode in [A_IT,A_ITE,A_ITT,
+                             A_ITEE,A_ITTE,A_ITET,A_ITTT,
+                             A_ITEEE,A_ITTEE,A_ITETE,A_ITTTE,A_ITEET,A_ITTET,A_ITETT,A_ITTTT] then
+              begin
+                { search for condition, conditions are always 2 chars }
+                if length(hs)>1 then
+                  begin
+                    for icond:=low(tasmcond) to high(tasmcond) do
+                      begin
+                        if copy(hs,1,2)=uppercond2str[icond] then
+                          begin
+                            //actcondition:=icond;
+                            oper.opr.typ := OPR_COND;
+                            oper.opr.cc := icond;
+                            exit(true);
+                          end;
+                      end;
+                  end;
+              end;
+          end;
+
       var
       var
         tempreg : tregister;
         tempreg : tregister;
         ireg : tsuperregister;
         ireg : tsuperregister;
@@ -687,6 +713,12 @@ Unit raarmgas;
           *)
           *)
           AS_ID: { A constant expression, or a Variable ref.  }
           AS_ID: { A constant expression, or a Variable ref.  }
             Begin
             Begin
+              { Condition code? }
+              if is_conditioncode(actasmpattern) then
+              begin
+                consume(AS_ID);
+              end
+              else
               { Local Label ? }
               { Local Label ? }
               if is_locallabel(actasmpattern) then
               if is_locallabel(actasmpattern) then
                begin
                begin
@@ -970,6 +1002,7 @@ Unit raarmgas;
           end;
           end;
         if actopcode=A_NONE then
         if actopcode=A_NONE then
           exit;
           exit;
+			 
         { search for condition, conditions are always 2 chars }
         { search for condition, conditions are always 2 chars }
         if length(hs)>1 then
         if length(hs)>1 then
           begin
           begin

+ 111 - 0
compiler/arm/rgcpu.pas

@@ -39,6 +39,11 @@ unit rgcpu;
          procedure do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
          procedure do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
        end;
        end;
 
 
+       trgcputhumb2 = class(trgobj)
+         procedure do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
+         procedure do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
+       end;
+
        trgintcpu = class(trgcpu)
        trgintcpu = class(trgcpu)
          procedure add_cpu_interferences(p : tai);override;
          procedure add_cpu_interferences(p : tai);override;
        end;
        end;
@@ -157,6 +162,112 @@ unit rgcpu;
       end;
       end;
 
 
 
 
+    procedure trgcputhumb2.do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);
+      var
+        tmpref : treference;
+        helplist : TAsmList;
+        l : tasmlabel;
+        hreg : tregister;
+      begin
+        { don't load spilled register between
+          mov lr,pc
+          mov pc,r4
+          but befure the mov lr,pc
+        }
+        if assigned(pos.previous) and
+          (pos.typ=ait_instruction) and
+          (taicpu(pos).opcode=A_MOV) and
+          (taicpu(pos).oper[0]^.typ=top_reg) and
+          (taicpu(pos).oper[0]^.reg=NR_R14) and
+          (taicpu(pos).oper[1]^.typ=top_reg) and
+          (taicpu(pos).oper[1]^.reg=NR_PC) then
+          pos:=tai(pos.previous);
+
+        if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
+          begin
+            helplist:=TAsmList.create;
+            reference_reset(tmpref,sizeof(aint));
+            { create consts entry }
+            current_asmdata.getjumplabel(l);
+            cg.a_label(current_procinfo.aktlocaldata,l);
+            tmpref.symboldata:=current_procinfo.aktlocaldata.last;
+
+            current_procinfo.aktlocaldata.concat(tai_const.Create_32bit(spilltemp.offset));
+
+            { load consts entry }
+            if getregtype(tempreg)=R_INTREGISTER then
+              hreg:=getregisterinline(helplist,R_SUBWHOLE)
+            else
+              hreg:=cg.getintregister(helplist,OS_ADDR);
+
+            tmpref.symbol:=l;
+            tmpref.base:=NR_R15;
+            helplist.concat(taicpu.op_reg_ref(A_LDR,hreg,tmpref));
+
+            reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint));
+            tmpref.index:=hreg;
+
+            if spilltemp.index<>NR_NO then
+              internalerror(200401263);
+
+            helplist.concat(spilling_create_load(tmpref,tempreg));
+            if getregtype(tempreg)=R_INTREGISTER then
+              ungetregisterinline(helplist,hreg);
+
+            list.insertlistafter(pos,helplist);
+            helplist.free;
+          end
+        else
+          inherited do_spill_read(list,pos,spilltemp,tempreg);
+      end;
+
+
+    procedure trgcputhumb2.do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);
+      var
+        tmpref : treference;
+        helplist : TAsmList;
+        l : tasmlabel;
+        hreg : tregister;
+      begin
+        if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
+          begin
+            helplist:=TAsmList.create;
+            reference_reset(tmpref,sizeof(aint));
+            { create consts entry }
+            current_asmdata.getjumplabel(l);
+            cg.a_label(current_procinfo.aktlocaldata,l);
+            tmpref.symboldata:=current_procinfo.aktlocaldata.last;
+
+            current_procinfo.aktlocaldata.concat(tai_const.Create_32bit(spilltemp.offset));
+
+            { load consts entry }
+            if getregtype(tempreg)=R_INTREGISTER then
+              hreg:=getregisterinline(helplist,R_SUBWHOLE)
+            else
+              hreg:=cg.getintregister(helplist,OS_ADDR);
+            tmpref.symbol:=l;
+            tmpref.base:=NR_R15;
+            helplist.concat(taicpu.op_reg_ref(A_LDR,hreg,tmpref));
+
+            if spilltemp.index<>NR_NO then
+              internalerror(200401263);
+
+            reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(pint));
+            tmpref.index:=hreg;
+
+            helplist.concat(spilling_create_store(tempreg,tmpref));
+
+            if getregtype(tempreg)=R_INTREGISTER then
+              ungetregisterinline(helplist,hreg);
+
+            list.insertlistafter(pos,helplist);
+            helplist.free;
+          end
+        else
+          inherited do_spill_written(list,pos,spilltemp,tempreg);
+      end;
+
+
     procedure trgintcpu.add_cpu_interferences(p : tai);
     procedure trgintcpu.add_cpu_interferences(p : tai);
       var
       var
         r : tregister;
         r : tregister;

+ 8 - 3
compiler/avr/cgcpu.pas

@@ -110,6 +110,8 @@ unit cgcpu;
         procedure a_op64_const_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_const_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
       end;
       end;
+      
+    procedure create_codegen;
 
 
     const
     const
       OpCmp2AsmCond : Array[topcmp] of TAsmCond = (C_NONE,C_EQ,C_GT,
       OpCmp2AsmCond : Array[topcmp] of TAsmCond = (C_NONE,C_EQ,C_GT,
@@ -829,7 +831,10 @@ unit cgcpu;
       end;
       end;
 
 
 
 
-begin
-  cg:=tcgavr.create;
-  cg64:=tcg64favr.create;
+    procedure create_codegen;
+      begin
+        cg:=tcgavr.create;
+        cg64:=tcg64favr.create;
+      end;
+      
 end.
 end.

+ 9 - 7
compiler/cgobj.pas

@@ -582,6 +582,7 @@ unit cgobj;
        cg64 : tcg64;
        cg64 : tcg64;
 {$endif cpu64bitalu}
 {$endif cpu64bitalu}
 
 
+    procedure destroy_codegen;
 
 
 implementation
 implementation
 
 
@@ -3996,16 +3997,17 @@ implementation
             internalerror(2006082211);
             internalerror(2006082211);
         end;
         end;
       end;
       end;
-
 {$endif cpu64bitalu}
 {$endif cpu64bitalu}
 
 
 
 
-
-initialization
-    ;
-finalization
-  cg.free;
+    procedure destroy_codegen;
+      begin
+        cg.free;
+        cg:=nil;
 {$ifndef cpu64bitalu}
 {$ifndef cpu64bitalu}
-  cg64.free;
+        cg64.free;
+        cg64:=nil;
 {$endif cpu64bitalu}
 {$endif cpu64bitalu}
+      end;
+
 end.
 end.

+ 95 - 17
compiler/dbgdwarf.pas

@@ -299,6 +299,7 @@ interface
         procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
         procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
 
 
         function symname(sym:tsym): String; virtual;
         function symname(sym:tsym): String; virtual;
+        procedure append_visibility(vis: tvisibility);
 
 
         procedure enum_membersyms_callback(p:TObject;arg:pointer);
         procedure enum_membersyms_callback(p:TObject;arg:pointer);
 
 
@@ -1733,14 +1734,30 @@ implementation
         cc             : Tdwarf_calling_convention;
         cc             : Tdwarf_calling_convention;
         st             : tsymtable;
         st             : tsymtable;
         vmtindexnr     : pint;
         vmtindexnr     : pint;
+        incurrentunit  : boolean;
       begin
       begin
-        if not assigned(def.procstarttai) then
+        { only write debug info for procedures defined in the current module,
+          except in case of methods (gcc-compatible)
+        }
+        st:=def.owner;
+        while not(st.symtabletype in [globalsymtable,staticsymtable]) do
+          st:=st.defowner.owner;
+        incurrentunit:=st.iscurrentunit;
+
+        if not incurrentunit and
+          (def.owner.symtabletype<>objectsymtable) then
+          exit;
+
+        { happens for init procdef of units without init section }
+        if incurrentunit and
+           not assigned(def.procstarttai) then
           exit;
           exit;
 
 
         { Procdefs are not handled by the regular def writing code, so
         { Procdefs are not handled by the regular def writing code, so
           dbg_state is not set/checked for them. Do it here.  }
           dbg_state is not set/checked for them. Do it here.  }
         if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
         if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
           exit;
           exit;
+        defnumberlist.Add(def);
 
 
         { Write methods and only in the scope of their parent objectdefs.  }
         { Write methods and only in the scope of their parent objectdefs.  }
         if (def.owner.symtabletype=objectsymtable) then
         if (def.owner.symtabletype=objectsymtable) then
@@ -1808,21 +1825,31 @@ implementation
             current_asmdata.asmlists[al_dwarf_info].concat(tai_const.Create_uleb128bit(vmtindexnr));
             current_asmdata.asmlists[al_dwarf_info].concat(tai_const.Create_uleb128bit(vmtindexnr));
           end;
           end;
 
 
+        { accessibility: public/private/protected }
+        if (def.owner.symtabletype=objectsymtable) then
+          append_visibility(def.visibility);
+
         { Return type.  }
         { Return type.  }
         if not(is_void(tprocdef(def).returndef)) then
         if not(is_void(tprocdef(def).returndef)) then
           append_labelentry_ref(DW_AT_type,def_dwarf_lab(tprocdef(def).returndef));
           append_labelentry_ref(DW_AT_type,def_dwarf_lab(tprocdef(def).returndef));
 
 
-        { mark end of procedure }
-        current_asmdata.getlabel(procendlabel,alt_dbgtype);
-        current_asmdata.asmlists[al_procedures].insertbefore(tai_label.create(procendlabel),def.procendtai);
+        { we can only write the start/end if this procedure is implemented in
+          this module
+        }
+        if incurrentunit then
+          begin
+            { mark end of procedure }
+            current_asmdata.getlabel(procendlabel,alt_dbgtype);
+            current_asmdata.asmlists[al_procedures].insertbefore(tai_label.create(procendlabel),def.procendtai);
 
 
-        if (target_info.system = system_powerpc64_linux) then
-          procentry := '.' + def.mangledname
-        else
-          procentry := def.mangledname;
+            if (target_info.system = system_powerpc64_linux) then
+              procentry := '.' + def.mangledname
+            else
+              procentry := def.mangledname;
 
 
-        append_labelentry(DW_AT_low_pc,current_asmdata.RefAsmSymbol(procentry));
-        append_labelentry(DW_AT_high_pc,procendlabel);
+            append_labelentry(DW_AT_low_pc,current_asmdata.RefAsmSymbol(procentry));
+            append_labelentry(DW_AT_high_pc,procendlabel);
+          end;
 
 
         { Don't write the funcretsym explicitly, it's also in the
         { Don't write the funcretsym explicitly, it's also in the
           localsymtable and/or parasymtable.
           localsymtable and/or parasymtable.
@@ -1843,14 +1870,17 @@ implementation
           end;
           end;
         { local type defs and vars should not be written
         { local type defs and vars should not be written
           inside the main proc }
           inside the main proc }
-        if assigned(def.localst) and
+        if incurrentunit and
+           assigned(def.localst) and
            (def.localst.symtabletype=localsymtable) then
            (def.localst.symtabletype=localsymtable) then
           write_symtable_syms(current_asmdata.asmlists[al_dwarf_info],def.localst);
           write_symtable_syms(current_asmdata.asmlists[al_dwarf_info],def.localst);
 
 
         { last write the types from this procdef }
         { last write the types from this procdef }
         if assigned(def.parast) then
         if assigned(def.parast) then
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.parast);
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.parast);
-        if assigned(def.localst) and
+        { only try to write the localst if the routine is implemented here }
+        if incurrentunit and
+           assigned(def.localst) and
            (def.localst.symtabletype=localsymtable) then
            (def.localst.symtabletype=localsymtable) then
           begin
           begin
             write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.localst);
             write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.localst);
@@ -1999,10 +2029,17 @@ implementation
                 paravarsym,
                 paravarsym,
                 localvarsym:
                 localvarsym:
                   begin
                   begin
-                    dreg:=dwarf_reg(sym.localloc.reference.base);
-                    templist.concat(tai_const.create_8bit(ord(DW_OP_breg0)+dreg));
-                    templist.concat(tai_const.create_sleb128bit(sym.localloc.reference.offset+offset));
-                    blocksize:=1+Lengthsleb128(sym.localloc.reference.offset);
+                    { Happens when writing debug info for paras of procdefs not
+                      implemented in the current module. Can't add a general check
+                      for LOC_INVALID above, because staticvarsyms may also have it.
+                    }
+                    if sym.localloc.loc<> LOC_INVALID then
+                      begin
+                        dreg:=dwarf_reg(sym.localloc.reference.base);
+                        templist.concat(tai_const.create_8bit(ord(DW_OP_breg0)+dreg));
+                        templist.concat(tai_const.create_sleb128bit(sym.localloc.reference.offset+offset));
+                        blocksize:=1+Lengthsleb128(sym.localloc.reference.offset);
+                      end;
                   end
                   end
                 else
                 else
                   internalerror(200601288);
                   internalerror(200601288);
@@ -2022,7 +2059,23 @@ implementation
         else
         else
           tag:=DW_TAG_variable;
           tag:=DW_TAG_variable;
 
 
-        if not(sym.localloc.loc in [LOC_REGISTER,LOC_CREGISTER,LOC_MMREGISTER,
+        { must be parasym of externally implemented procdef, but
+          the parasymtable can con also contain e.g. absolutevarsyms
+          -> check symtabletype}
+        if (sym.owner.symtabletype=parasymtable) and
+           (sym.localloc.loc=LOC_INVALID) then
+          begin
+            if (sym.owner.symtabletype<>parasymtable) then
+              internalerror(2009101001);
+            append_entry(tag,false,[
+              DW_AT_name,DW_FORM_string,name+#0
+              {
+              DW_AT_decl_file,DW_FORM_data1,0,
+              DW_AT_decl_line,DW_FORM_data1,
+              }
+              ])
+          end
+        else if not(sym.localloc.loc in [LOC_REGISTER,LOC_CREGISTER,LOC_MMREGISTER,
                                  LOC_CMMREGISTER,LOC_FPUREGISTER,LOC_CFPUREGISTER]) and
                                  LOC_CMMREGISTER,LOC_FPUREGISTER,LOC_CFPUREGISTER]) and
            ((sym.owner.symtabletype = globalsymtable) or
            ((sym.owner.symtabletype = globalsymtable) or
             (sp_static in sym.symoptions) or
             (sp_static in sym.symoptions) or
@@ -2168,6 +2221,8 @@ implementation
           end;
           end;
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(fieldoffset));
         current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(fieldoffset));
+        if (sym.owner.symtabletype=objectsymtable) then
+          append_visibility(sym.visibility);
 
 
         append_labelentry_ref(DW_AT_type,def_dwarf_lab(def));
         append_labelentry_ref(DW_AT_type,def_dwarf_lab(def));
         finish_entry;
         finish_entry;
@@ -2176,6 +2231,14 @@ implementation
 
 
     procedure TDebugInfoDwarf.appendsym_const(list:TAsmList;sym:tconstsym);
     procedure TDebugInfoDwarf.appendsym_const(list:TAsmList;sym:tconstsym);
       begin
       begin
+        { These are default values of parameters. These should be encoded
+          via DW_AT_default_value, not as a separate sym. Moreover, their
+          type is not available when writing the debug info for external
+          procedures.
+        }
+        if (sym.owner.symtabletype=parasymtable) then
+          exit;
+
         append_entry(DW_TAG_constant,false,[
         append_entry(DW_TAG_constant,false,[
           DW_AT_name,DW_FORM_string,symname(sym)+#0
           DW_AT_name,DW_FORM_string,symname(sym)+#0
           ]);
           ]);
@@ -2766,6 +2829,21 @@ implementation
       end;
       end;
 
 
 
 
+    procedure tdebuginfodwarf.append_visibility(vis: tvisibility);
+      begin
+        case vis of
+          vis_private,
+          vis_strictprivate:
+            append_attribute(DW_AT_accessibility,DW_FORM_data1,[ord(DW_ACCESS_private)]);
+          vis_protected,
+          vis_strictprotected:
+            append_attribute(DW_AT_accessibility,DW_FORM_data1,[ord(DW_ACCESS_protected)]);
+          vis_public:
+            { default };
+        end;
+      end;
+
+
     procedure TDebugInfoDwarf.insertlineinfo(list:TAsmList);
     procedure TDebugInfoDwarf.insertlineinfo(list:TAsmList);
       var
       var
         currfileinfo,
         currfileinfo,

+ 47 - 15
compiler/dbgstabs.pas

@@ -27,7 +27,7 @@ interface
 
 
     uses
     uses
       cclasses,
       cclasses,
-      dbgbase,
+      dbgbase,cgbase,
       symtype,symdef,symsym,symtable,symbase,
       symtype,symdef,symsym,symtable,symbase,
       aasmtai,aasmdata;
       aasmtai,aasmdata;
 
 
@@ -74,6 +74,7 @@ interface
         procedure method_add_stabstr(p:TObject;arg:pointer);
         procedure method_add_stabstr(p:TObject;arg:pointer);
         procedure field_write_defs(p:TObject;arg:pointer);
         procedure field_write_defs(p:TObject;arg:pointer);
         function  get_enum_defstr(def: tenumdef; lowerbound: longint): ansistring;
         function  get_enum_defstr(def: tenumdef; lowerbound: longint): ansistring;
+        function  get_appendsym_paravar_reg(sym:tparavarsym;const typ,stabstr:string;reg: tregister): ansistring;
       protected
       protected
         procedure appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);override;
         procedure appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);override;
         procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);override;
         procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);override;
@@ -112,7 +113,7 @@ implementation
       SysUtils,cutils,cfileutl,
       SysUtils,cutils,cfileutl,
       systems,globals,globtype,verbose,constexp,
       systems,globals,globtype,verbose,constexp,
       symconst,defutil,
       symconst,defutil,
-      cpuinfo,cpubase,cgbase,paramgr,
+      cpuinfo,cpubase,paramgr,
       aasmbase,procinfo,
       aasmbase,procinfo,
       finput,fmodule,ppu;
       finput,fmodule,ppu;
 
 
@@ -1276,12 +1277,30 @@ implementation
       end;
       end;
 
 
 
 
+    function TDebugInfoStabs.get_appendsym_paravar_reg(sym:tparavarsym;const typ,stabstr:string;reg: tregister): ansistring;
+      var
+        ltyp: string[1];
+        regidx : Tregisterindex;
+      begin
+        result:='';
+        if typ='p' then
+          ltyp:='R'
+        else
+          ltyp:='a';
+        regidx:=findreg_by_number(reg);
+        { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
+        { this is the register order for GDB}
+        if regidx<>0 then
+          result:=sym_stabstr_evaluate(sym,'"${name}:$1",${N_RSYM},0,${line},$2',[ltyp+stabstr,tostr(longint(regstabs_table[regidx]))]);
+      end;
+
+
     procedure TDebugInfoStabs.appendsym_paravar(list:TAsmList;sym:tparavarsym);
     procedure TDebugInfoStabs.appendsym_paravar(list:TAsmList;sym:tparavarsym);
       var
       var
         ss : ansistring;
         ss : ansistring;
+        c  : string[1];
         st : string;
         st : string;
         regidx : Tregisterindex;
         regidx : Tregisterindex;
-        c : char;
       begin
       begin
         ss:='';
         ss:='';
         { set loc to LOC_REFERENCE to get somewhat usable debugging info for -Or }
         { set loc to LOC_REFERENCE to get somewhat usable debugging info for -Or }
@@ -1344,23 +1363,36 @@ implementation
               LOC_FPUREGISTER,
               LOC_FPUREGISTER,
               LOC_CFPUREGISTER :
               LOC_CFPUREGISTER :
                 begin
                 begin
-                  if c='p' then
-                    c:='R'
-                  else
-                    c:='a';
-                  st:=c+st;
-                  regidx:=findreg_by_number(sym.localloc.register);
-                  { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
-                  { this is the register order for GDB}
-                  if regidx<>0 then
-                    ss:=sym_stabstr_evaluate(sym,'"${name}:$1",${N_RSYM},0,${line},$2',[st,tostr(longint(regstabs_table[regidx]))]);
+                  ss:=get_appendsym_paravar_reg(sym,c,st,sym.localloc.register);
                 end;
                 end;
               LOC_REFERENCE :
               LOC_REFERENCE :
                 begin
                 begin
-                  st:=c+st;
+                  { When the *value* of a parameter (so not its address!) is
+                    copied into a local variable, you have to generate two
+                    stabs: one for the parmeter, and one for the local copy.
+                    Not doing this breaks debugging under e.g. SPARC. Doc:
+                    http://sourceware.org/gdb/current/onlinedocs/stabs_4.html#SEC26
+                  }
+                  if (c='p') and
+                     not is_open_string(sym.vardef) and
+                     ((sym.paraloc[calleeside].location^.loc<>sym.localloc.loc) or
+                      ((sym.localloc.loc in [LOC_REFERENCE,LOC_CREFERENCE]) and
+                       ((sym.paraloc[calleeside].location^.reference.index<>sym.localloc.reference.base) or
+                        (sym.paraloc[calleeside].location^.reference.offset<>sym.localloc.reference.offset))) or
+                      ((sym.localloc.loc in [LOC_REGISTER,LOC_CREGISTER,LOC_MMREGISTER,LOC_CMMREGISTER,LOC_FPUREGISTER,LOC_CFPUREGISTER]) and
+                       (sym.localloc.register<>sym.paraloc[calleeside].location^.register))) then
+                    begin
+                      if not(sym.paraloc[calleeside].location^.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
+                        ss:=get_appendsym_paravar_reg(sym,c,st,sym.paraloc[calleeside].location^.register)
+                      else
+                        ss:=sym_stabstr_evaluate(sym,'"${name}:$1",${N_TSYM},0,${line},$2',[c+st,tostr(sym.paraloc[calleeside].location^.reference.offset)]);
+                      write_sym_stabstr(list,sym,ss);
+                      { second stab has no parameter specifier }
+                      c:='';
+                    end;
                   { offset to ebp => will not work if the framepointer is esp
                   { offset to ebp => will not work if the framepointer is esp
                     so some optimizing will make things harder to debug }
                     so some optimizing will make things harder to debug }
-                  ss:=sym_stabstr_evaluate(sym,'"${name}:$1",${N_TSYM},0,${line},$2',[st,tostr(sym.localloc.reference.offset)])
+                  ss:=sym_stabstr_evaluate(sym,'"${name}:$1",${N_TSYM},0,${line},$2',[c+st,tostr(sym.localloc.reference.offset)])
                 end;
                 end;
               else
               else
                 internalerror(2003091814);
                 internalerror(2003091814);

+ 19 - 7
compiler/htypechk.pas

@@ -108,9 +108,9 @@ interface
         (tok:_LTE     ;nod:lten;op_overloading_supported:true),      { binary overloading supported }
         (tok:_LTE     ;nod:lten;op_overloading_supported:true),      { binary overloading supported }
         (tok:_SYMDIF  ;nod:symdifn;op_overloading_supported:true),   { binary overloading supported }
         (tok:_SYMDIF  ;nod:symdifn;op_overloading_supported:true),   { binary overloading supported }
         (tok:_STARSTAR;nod:starstarn;op_overloading_supported:true), { binary overloading supported }
         (tok:_STARSTAR;nod:starstarn;op_overloading_supported:true), { binary overloading supported }
-        (tok:_OP_AS     ;nod:asn;op_overloading_supported:false),     { binary overloading NOT supported }
-        (tok:_OP_IN     ;nod:inn;op_overloading_supported:false),     { binary overloading NOT supported }
-        (tok:_OP_IS     ;nod:isn;op_overloading_supported:false),     { binary overloading NOT supported }
+        (tok:_OP_AS     ;nod:asn;op_overloading_supported:false),    { binary overloading NOT supported }
+        (tok:_OP_IN     ;nod:inn;op_overloading_supported:false),    { binary overloading NOT supported }
+        (tok:_OP_IS     ;nod:isn;op_overloading_supported:false),    { binary overloading NOT supported }
         (tok:_OP_OR     ;nod:orn;op_overloading_supported:true),     { binary overloading supported }
         (tok:_OP_OR     ;nod:orn;op_overloading_supported:true),     { binary overloading supported }
         (tok:_OP_AND    ;nod:andn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_AND    ;nod:andn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_DIV    ;nod:divn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_DIV    ;nod:divn;op_overloading_supported:true),    { binary overloading supported }
@@ -120,7 +120,7 @@ interface
         (tok:_OP_SHR    ;nod:shrn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_SHR    ;nod:shrn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_XOR    ;nod:xorn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_OP_XOR    ;nod:xorn;op_overloading_supported:true),    { binary overloading supported }
         (tok:_ASSIGNMENT;nod:assignn;op_overloading_supported:true), { unary overloading supported }
         (tok:_ASSIGNMENT;nod:assignn;op_overloading_supported:true), { unary overloading supported }
-        (tok:_UNEQUAL ;nod:unequaln;op_overloading_supported:false)   { binary overloading NOT supported  overload = instead }
+        (tok:_UNEQUAL ;nod:unequaln;op_overloading_supported:false)  { binary overloading NOT supported  overload = instead }
       );
       );
 
 
       { true, if we are parsing stuff which allows array constructors }
       { true, if we are parsing stuff which allows array constructors }
@@ -160,7 +160,7 @@ interface
 
 
     function allowenumop(nt:tnodetype):boolean;
     function allowenumop(nt:tnodetype):boolean;
 
 
-    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions);
+    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring);
 
 
     procedure check_ranges(const location: tfileposinfo; source: tnode; destdef: tdef);
     procedure check_ranges(const location: tfileposinfo; source: tnode; destdef: tdef);
 
 
@@ -421,6 +421,13 @@ implementation
                       (not is_shortstring(pf.returndef) or
                       (not is_shortstring(pf.returndef) or
                        (tstringdef(pf.returndef).len=255));
                        (tstringdef(pf.returndef).len=255));
                   end
                   end
+                else
+                { enumerator is a special case too }
+                if optoken=_OP_ENUMERATOR then
+                  begin
+                    result:=
+                      is_class_or_interface_or_object(pf.returndef);
+                  end
                 else
                 else
                   begin
                   begin
                     for i:=1 to tok2nodes do
                     for i:=1 to tok2nodes do
@@ -2605,16 +2612,21 @@ implementation
       end;
       end;
 
 
 
 
-    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions);
+    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring);
       begin
       begin
         if not assigned(srsym) then
         if not assigned(srsym) then
           internalerror(200602051);
           internalerror(200602051);
         if sp_hint_deprecated in symoptions then
         if sp_hint_deprecated in symoptions then
-          Message1(sym_w_deprecated_symbol,srsym.realname);
+          if (sp_has_deprecated_msg in symoptions) and (deprecatedmsg <> nil) then
+            Message2(sym_w_deprecated_symbol_with_msg,srsym.realname,deprecatedmsg^)
+          else
+            Message1(sym_w_deprecated_symbol,srsym.realname);
         if sp_hint_experimental in symoptions then
         if sp_hint_experimental in symoptions then
           Message1(sym_w_experimental_symbol,srsym.realname);
           Message1(sym_w_experimental_symbol,srsym.realname);
         if sp_hint_platform in symoptions then
         if sp_hint_platform in symoptions then
           Message1(sym_w_non_portable_symbol,srsym.realname);
           Message1(sym_w_non_portable_symbol,srsym.realname);
+        if sp_hint_library in symoptions then
+          Message1(sym_w_library_symbol,srsym.realname);
         if sp_hint_unimplemented in symoptions then
         if sp_hint_unimplemented in symoptions then
           Message1(sym_w_non_implemented_symbol,srsym.realname);
           Message1(sym_w_non_implemented_symbol,srsym.realname);
       end;
       end;

+ 8 - 3
compiler/i386/cgcpu.pas

@@ -63,6 +63,8 @@ unit cgcpu;
       private
       private
         procedure get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
         procedure get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
       end;
       end;
+      
+    procedure create_codegen;
 
 
   implementation
   implementation
 
 
@@ -851,7 +853,10 @@ unit cgcpu;
         end;
         end;
       end;
       end;
 
 
-begin
-  cg := tcg386.create;
-  cg64 := tcg64f386.create;
+    procedure create_codegen;
+      begin
+        cg := tcg386.create;
+        cg64 := tcg64f386.create;
+      end;
+      
 end.
 end.

+ 8 - 3
compiler/m68k/cgcpu.pas

@@ -130,6 +130,7 @@ unit cgcpu;
          S_FS,S_FD,S_FX,S_NO,S_NO,
          S_FS,S_FD,S_FX,S_NO,S_NO,
          S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO);
          S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO);
 
 
+    procedure create_codegen;
 
 
   implementation
   implementation
 
 
@@ -1738,8 +1739,12 @@ unit cgcpu;
         end;
         end;
     end; { end case }
     end; { end case }
   end;
   end;
+  
+  
+procedure create_codegen;
+  begin
+    cg := tcg68k.create;
+    cg64 :=tcg64f68k.create;
+  end;
 
 
-begin
-  cg := tcg68k.create;
-  cg64 :=tcg64f68k.create;
 end.
 end.

+ 41 - 10
compiler/msg/errord.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <karl-michael.schindler at web.de>
 #   <karl-michael.schindler at web.de>
 #
 #
-#   Based on errore.msg of SVN revision 13334
+#   Based on errore.msg of SVN revision 14001
 #
 #
 #   This file is part of the Free Pascal Compiler
 #   This file is part of the Free Pascal Compiler
 #   Copyright (c) 1998-2009 by the Free Pascal Development team
 #   Copyright (c) 1998-2009 by the Free Pascal Development team
@@ -370,7 +370,7 @@ scan_w_multiple_main_name_overrides=02086_W_Der Name der "main" Prozedur wird me
 #
 #
 # Parser
 # Parser
 #
 #
-# 03252 is the last used one
+# 03258 is the last used one
 #
 #
 % \section{Parser messages}
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
 % This section lists all parser messages. The parser takes care of the
@@ -1194,11 +1194,25 @@ parser_e_no_local_para_def=03252_E_Parameter k
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % ``file of byte'' or ``string[50]'' also define a new type.
 % ``file of byte'' or ``string[50]'' also define a new type.
+parser_e_abstract_and_sealed_conflict=03253_E_Konflikt zwischen ABSTRACT und SEALED 
+% ABSTRACT and SEALED can not be used together in one declaration
+parser_e_sealed_descendant=03254_E_Kann keinen Nachfahren der SEALED Klasse "$1" erzeugen
+% Sealed means that class can not be derived by another class.
+parser_e_sealed_class_cannot_have_abstract_methods=03255_E_Eine SEALED Klasse kann keine ABSTRACT Methode haben
+% Sealed means that class cannot be derived. Therefore no one class is able to override an abstract method in a sealed class.
+parser_e_only_virtual_methods_final=03256_E_Nur virtuelle Methoden k”nnen final sein.
+% You are declaring a method as final, when it is not declared to be
+% virtual.
+parser_e_final_can_no_be_overridden=03257_E_Die finale Methode kann nicht �berschrieben werden: "$1"
+% You are trying to \var{override} a virtual method of a parent class that does
+% not exist.
+parser_e_multiple_messages=03258_E_Pro Methode kann nur eine Nachricht verwendet werden.
+% It is not possible to associate multiple messages with a single method.
 % \end{description}
 % \end{description}
 #
 #
 # Type Checking
 # Type Checking
 #
 #
-# 04087 is the last used one
+# 04090 is the last used one
 #
 #
 % \section{Type checking errors}
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
 % This section lists all errors that can occur when type checking is
@@ -1273,7 +1287,7 @@ type_w_convert_real_2_comp=04014_W_Automatische Typumwandlung von Fliesskommatyp
 type_h_use_div_for_int=04015_H_Verwenden sie DIV um ein Integer-Ergebnis zu erhalten
 type_h_use_div_for_int=04015_H_Verwenden sie DIV um ein Integer-Ergebnis zu erhalten
 % When hints are on, then an integer division with the '/' operator will
 % When hints are on, then an integer division with the '/' operator will
 % produce this message, because the result will then be of type real.
 % produce this message, because the result will then be of type real.
-type_e_strict_var_string_violation=04016_E_Stringtypen passen nicht zueinander, da in "$V+"-Modus
+type_e_strict_var_string_violation=04016_E_Stringtypen m�ssen im "$V+"-Modus exakt �bereinstimmen
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % should be of the exact same type as the declared parameter of the procedure.
 % should be of the exact same type as the declared parameter of the procedure.
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_Succ oder Pred kann nicht auf Aufz„hlungen mit Zuweisungen angewendet werden
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_Succ oder Pred kann nicht auf Aufz„hlungen mit Zuweisungen angewendet werden
@@ -1496,11 +1510,17 @@ type_e_no_type_info=04087_E_F
 % Type information is not generated for some types, such as enumerations with gaps
 % Type information is not generated for some types, such as enumerations with gaps
 % in their value range (this includes enumerations whose lower bound is different
 % in their value range (this includes enumerations whose lower bound is different
 % from zero).
 % from zero).
+type_e_ordinal_or_string_expr_expected=04088_E_Ausdruck mit ordinalem Typ oder Zeichenkette erwartet
+% The expression must be an ordinal or string type.
+type_e_string_expr_expected=04089_E_Ausdruck mit Zeichenkette erwartet
+% The expression must be a string type.
+type_w_zero_to_nil=04090_W_Konvertiere 0 zu NIL
+% Use NIL rather than 0 when initialising a pointer. 
 % \end{description}
 % \end{description}
 #
 #
 # Symtable
 # Symtable
 #
 #
-# 05064 is the last used one
+# 05066 is the last used one
 #
 #
 % \section{Symbol handling}
 % \section{Symbol handling}
 % This section lists all the messages that concern the handling of symbols.
 % This section lists all the messages that concern the handling of symbols.
@@ -1671,6 +1691,15 @@ sym_w_experimental_symbol=05063_W_Symbol "$1" ist experimentell
 sym_w_forward_not_resolved=05064_W_Forward Deklaration "$1" wird nicht aufgel”st und deshalb als extern angenommen
 sym_w_forward_not_resolved=05064_W_Forward Deklaration "$1" wird nicht aufgel”st und deshalb als extern angenommen
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % but do not implement it.
 % but do not implement it.
+sym_w_library_symbol=05065_W_Symbol "$1" geh”rt zu einer Bibliothek
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{library} is used. Library symbols may not be
+% available in other libraries.
+sym_w_deprecated_symbol_with_msg=05066_W_Symbol "$1" ist veraltet: "$2"
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{deprecated} is used. Deprecated symbols may no longer
+% be available in newer versions of the unit / library. Use of this symbol
+% should be avoided as much as possible.
 % \end{description}
 % \end{description}
 #
 #
 # Codegenerator
 # Codegenerator
@@ -2057,7 +2086,7 @@ asmr_e_need_pic_ref=07107_E_Erzeuge eigentlich PIC, aber die Referenz ist nicht
 #
 #
 # Assembler/binary writers
 # Assembler/binary writers
 #
 #
-# 08020 is the last used one
+# 08021 is the last used one
 #
 #
 asmw_f_too_many_asm_files=08000_F_Zu viele Assembler-Dateien
 asmw_f_too_many_asm_files=08000_F_Zu viele Assembler-Dateien
 % With smartlinking enabled, there are too many assembler
 % With smartlinking enabled, there are too many assembler
@@ -2211,7 +2240,7 @@ execinfo_x_stackcommit=09134_X_Stack Bereich "committed": $1 Bytes
 #
 #
 # Internal linker messages
 # Internal linker messages
 #
 #
-# 09200 is the last used one
+# 09201 is the last used one
 #
 #
 # BeginOfTeX
 # BeginOfTeX
 % \section{Linker messages}
 % \section{Linker messages}
@@ -2432,7 +2461,7 @@ unit_e_different_wpo_file=10061_E_Unit $1 wurde mit einer anderen Feedback-Einga
 #
 #
 #  Options
 #  Options
 #
 #
-# 11046 is the last used one
+# 11047 is the last used one
 #
 #
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 # BeginOfTeX
 # BeginOfTeX
@@ -2546,14 +2575,16 @@ option_else_without_if=11043_F_Zur \var{\#ELSE} Direktive in Zeile $2 der Option
 option_unsupported_target=11044_F_Die Option "$1" wird auf der Zielplattform nicht oder noch nicht unterst�tzt
 option_unsupported_target=11044_F_Die Option "$1" wird auf der Zielplattform nicht oder noch nicht unterst�tzt
 % Not all options are supported or implemented for all target platforms. This message informs you that a chosen
 % Not all options are supported or implemented for all target platforms. This message informs you that a chosen
 % option is incompatible with the currently selected target platform.
 % option is incompatible with the currently selected target platform.
-%\end{description}
 option_unsupported_target_for_feature=11045_F_Das Feature "$1" wird f�r die ausgew„hlte Zielplattform nicht oder noch nicht unterst�tzt
 option_unsupported_target_for_feature=11045_F_Das Feature "$1" wird f�r die ausgew„hlte Zielplattform nicht oder noch nicht unterst�tzt
 % Not all features are supported or implemented for all target platforms. This message informs you that a chosen
 % Not all features are supported or implemented for all target platforms. This message informs you that a chosen
 % feature is incompatible with the currently selected target platform.
 % feature is incompatible with the currently selected target platform.
 option_dwarf_smart_linking=11046_N_DWARF Debug-Information kann auf dieser Zielplattform nicht zusammen mit Smartlinking benutzt werden, es wird auf statisches Linken umgeschaltet
 option_dwarf_smart_linking=11046_N_DWARF Debug-Information kann auf dieser Zielplattform nicht zusammen mit Smartlinking benutzt werden, es wird auf statisches Linken umgeschaltet
 % Smart linking is currently incompatble with DWARF debug information on most
 % Smart linking is currently incompatble with DWARF debug information on most
 % platforms, so smart linking is disabled in such cases.
 % platforms, so smart linking is disabled in such cases.
-
+option_ignored_target=11047_W_Option "$1" wird f�r die ausgew„hlte Zielplattform ignoriert
+% Not all options are supported or implemented for all target platforms. This message informs you that a chosen
+% option is ignored for the currently selected target platform.
+%\end{description}
 # EndOfTeX
 # EndOfTeX
 
 
 #
 #

+ 41 - 10
compiler/msg/errordu.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <karl-michael.schindler at web.de>
 #   <karl-michael.schindler at web.de>
 #
 #
-#   Based on errore.msg of SVN revision 13334
+#   Based on errore.msg of SVN revision 14001
 #
 #
 #   This file is part of the Free Pascal Compiler
 #   This file is part of the Free Pascal Compiler
 #   Copyright (c) 1998-2009 by the Free Pascal Development team
 #   Copyright (c) 1998-2009 by the Free Pascal Development team
@@ -370,7 +370,7 @@ scan_w_multiple_main_name_overrides=02086_W_Der Name der "main" Prozedur wird me
 #
 #
 # Parser
 # Parser
 #
 #
-# 03252 is the last used one
+# 03258 is the last used one
 #
 #
 % \section{Parser messages}
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
 % This section lists all parser messages. The parser takes care of the
@@ -1194,11 +1194,25 @@ parser_e_no_local_para_def=03252_E_Parameter können keine lokalen Typdeklaratio
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % ``file of byte'' or ``string[50]'' also define a new type.
 % ``file of byte'' or ``string[50]'' also define a new type.
+parser_e_abstract_and_sealed_conflict=03253_E_Konflikt zwischen ABSTRACT und SEALED 
+% ABSTRACT and SEALED can not be used together in one declaration
+parser_e_sealed_descendant=03254_E_Kann keinen Nachfahren der SEALED Klasse "$1" erzeugen
+% Sealed means that class can not be derived by another class.
+parser_e_sealed_class_cannot_have_abstract_methods=03255_E_Eine SEALED Klasse kann keine ABSTRACT Methode haben
+% Sealed means that class cannot be derived. Therefore no one class is able to override an abstract method in a sealed class.
+parser_e_only_virtual_methods_final=03256_E_Nur virtuelle Methoden können final sein.
+% You are declaring a method as final, when it is not declared to be
+% virtual.
+parser_e_final_can_no_be_overridden=03257_E_Die finale Methode kann nicht überschrieben werden: "$1"
+% You are trying to \var{override} a virtual method of a parent class that does
+% not exist.
+parser_e_multiple_messages=03258_E_Pro Methode kann nur eine Nachricht verwendet werden.
+% It is not possible to associate multiple messages with a single method.
 % \end{description}
 % \end{description}
 #
 #
 # Type Checking
 # Type Checking
 #
 #
-# 04087 is the last used one
+# 04090 is the last used one
 #
 #
 % \section{Type checking errors}
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
 % This section lists all errors that can occur when type checking is
@@ -1273,7 +1287,7 @@ type_w_convert_real_2_comp=04014_W_Automatische Typumwandlung von Fliesskommatyp
 type_h_use_div_for_int=04015_H_Verwenden sie DIV um ein Integer-Ergebnis zu erhalten
 type_h_use_div_for_int=04015_H_Verwenden sie DIV um ein Integer-Ergebnis zu erhalten
 % When hints are on, then an integer division with the '/' operator will
 % When hints are on, then an integer division with the '/' operator will
 % produce this message, because the result will then be of type real.
 % produce this message, because the result will then be of type real.
-type_e_strict_var_string_violation=04016_E_Stringtypen passen nicht zueinander, da in "$V+"-Modus
+type_e_strict_var_string_violation=04016_E_Stringtypen müssen im "$V+"-Modus exakt übereinstimmen
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % should be of the exact same type as the declared parameter of the procedure.
 % should be of the exact same type as the declared parameter of the procedure.
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_Succ oder Pred kann nicht auf Aufzählungen mit Zuweisungen angewendet werden
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_Succ oder Pred kann nicht auf Aufzählungen mit Zuweisungen angewendet werden
@@ -1496,11 +1510,17 @@ type_e_no_type_info=04087_E_Für diesen Typ steht keine Typ-Information zu Verf
 % Type information is not generated for some types, such as enumerations with gaps
 % Type information is not generated for some types, such as enumerations with gaps
 % in their value range (this includes enumerations whose lower bound is different
 % in their value range (this includes enumerations whose lower bound is different
 % from zero).
 % from zero).
+type_e_ordinal_or_string_expr_expected=04088_E_Ausdruck mit ordinalem Typ oder Zeichenkette erwartet
+% The expression must be an ordinal or string type.
+type_e_string_expr_expected=04089_E_Ausdruck mit Zeichenkette erwartet
+% The expression must be a string type.
+type_w_zero_to_nil=04090_W_Konvertiere 0 zu NIL
+% Use NIL rather than 0 when initialising a pointer. 
 % \end{description}
 % \end{description}
 #
 #
 # Symtable
 # Symtable
 #
 #
-# 05064 is the last used one
+# 05066 is the last used one
 #
 #
 % \section{Symbol handling}
 % \section{Symbol handling}
 % This section lists all the messages that concern the handling of symbols.
 % This section lists all the messages that concern the handling of symbols.
@@ -1671,6 +1691,15 @@ sym_w_experimental_symbol=05063_W_Symbol "$1" ist experimentell
 sym_w_forward_not_resolved=05064_W_Forward Deklaration "$1" wird nicht aufgelöst und deshalb als extern angenommen
 sym_w_forward_not_resolved=05064_W_Forward Deklaration "$1" wird nicht aufgelöst und deshalb als extern angenommen
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % but do not implement it.
 % but do not implement it.
+sym_w_library_symbol=05065_W_Symbol "$1" gehört zu einer Bibliothek
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{library} is used. Library symbols may not be
+% available in other libraries.
+sym_w_deprecated_symbol_with_msg=05066_W_Symbol "$1" ist veraltet: "$2"
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{deprecated} is used. Deprecated symbols may no longer
+% be available in newer versions of the unit / library. Use of this symbol
+% should be avoided as much as possible.
 % \end{description}
 % \end{description}
 #
 #
 # Codegenerator
 # Codegenerator
@@ -2057,7 +2086,7 @@ asmr_e_need_pic_ref=07107_E_Erzeuge eigentlich PIC, aber die Referenz ist nicht
 #
 #
 # Assembler/binary writers
 # Assembler/binary writers
 #
 #
-# 08020 is the last used one
+# 08021 is the last used one
 #
 #
 asmw_f_too_many_asm_files=08000_F_Zu viele Assembler-Dateien
 asmw_f_too_many_asm_files=08000_F_Zu viele Assembler-Dateien
 % With smartlinking enabled, there are too many assembler
 % With smartlinking enabled, there are too many assembler
@@ -2211,7 +2240,7 @@ execinfo_x_stackcommit=09134_X_Stack Bereich "committed": $1 Bytes
 #
 #
 # Internal linker messages
 # Internal linker messages
 #
 #
-# 09200 is the last used one
+# 09201 is the last used one
 #
 #
 # BeginOfTeX
 # BeginOfTeX
 % \section{Linker messages}
 % \section{Linker messages}
@@ -2422,17 +2451,17 @@ unit_u_skipping_reresolving_unit=10059_U_Erneutes Resolving der Unit $1 wird üb
 unit_u_unload_resunit=10060_U_Entlade die Resource-Unit $1 (wird nicht benötigt) 
 unit_u_unload_resunit=10060_U_Entlade die Resource-Unit $1 (wird nicht benötigt) 
 % When you use the \var{-vu} flag, the compiler warns that it is unloading the 
 % When you use the \var{-vu} flag, the compiler warns that it is unloading the 
 % resource handling unit, since no resources are used.
 % resource handling unit, since no resources are used.
-% \end{description}
 unit_e_different_wpo_file=10061_E_Unit $1 wurde mit einer anderen Feedback-Eingabe ($2, $3) für die Gesamtprogramm-Optimierung (wpo) übersetzt. Bitte erneut ohne wpo oder mit der gleichen wpo-Feedback-Eingabe-Datei übersetzen
 unit_e_different_wpo_file=10061_E_Unit $1 wurde mit einer anderen Feedback-Eingabe ($2, $3) für die Gesamtprogramm-Optimierung (wpo) übersetzt. Bitte erneut ohne wpo oder mit der gleichen wpo-Feedback-Eingabe-Datei übersetzen
 % When a unit has been compiled using a particular whole program optimization (wpo) feedback file (\var{-FW<x>} \var{-OW<x>}),
 % When a unit has been compiled using a particular whole program optimization (wpo) feedback file (\var{-FW<x>} \var{-OW<x>}),
 % this compiled version of the unit is specialised for that particular compilation scenario and cannot be used in
 % this compiled version of the unit is specialised for that particular compilation scenario and cannot be used in
 % any other context. It has to be recompiled before you can use it in another program or with another wpo feedback input file.
 % any other context. It has to be recompiled before you can use it in another program or with another wpo feedback input file.
+% \end{description}
 # EndOfTeX
 # EndOfTeX
 
 
 #
 #
 #  Options
 #  Options
 #
 #
-# 11046 is the last used one
+# 11047 is the last used one
 #
 #
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 # BeginOfTeX
 # BeginOfTeX
@@ -2552,7 +2581,9 @@ option_unsupported_target_for_feature=11045_F_Das Feature "$1" wird für die aus
 option_dwarf_smart_linking=11046_N_DWARF Debug-Information kann auf dieser Zielplattform nicht zusammen mit Smartlinking benutzt werden, es wird auf statisches Linken umgeschaltet
 option_dwarf_smart_linking=11046_N_DWARF Debug-Information kann auf dieser Zielplattform nicht zusammen mit Smartlinking benutzt werden, es wird auf statisches Linken umgeschaltet
 % Smart linking is currently incompatble with DWARF debug information on most
 % Smart linking is currently incompatble with DWARF debug information on most
 % platforms, so smart linking is disabled in such cases.
 % platforms, so smart linking is disabled in such cases.
-
+option_ignored_target=11047_W_Option "$1" wird für die ausgewählte Zielplattform ignoriert
+% Not all options are supported or implemented for all target platforms. This message informs you that a chosen
+% option is ignored for the currently selected target platform.
 %\end{description}
 %\end{description}
 # EndOfTeX
 # EndOfTeX
 
 

+ 67 - 21
compiler/msg/errore.msg

@@ -366,7 +366,7 @@ scan_w_multiple_main_name_overrides=02086_W_Overriding name of "main" procedure
 #
 #
 # Parser
 # Parser
 #
 #
-# 03263 is the last used one
+# 03275 is the last used one
 #
 #
 % \section{Parser messages}
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
 % This section lists all parser messages. The parser takes care of the
@@ -1189,55 +1189,80 @@ parser_e_no_local_para_def=03252_E_Parameters cannot contain local type definiti
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % refer to the same type definition in the procedure headers of the interface and implementation of a unit
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % (both procedure headers would define a separate type). Keep in mind that expressions such as
 % ``file of byte'' or ``string[50]'' also define a new type.
 % ``file of byte'' or ``string[50]'' also define a new type.
-parser_e_objc_requires_msgstr=03253_E_Objective-C messages require their Objective-C selector name to be specified using the "message" directive.
+parser_e_abstract_and_sealed_conflict=03253_E_ABSTRACT and SEALED conflict
+% ABSTRACT and SEALED can not be used together in one declaration
+parser_e_sealed_descendant=03254_E_Can not create a descendant of the sealed class "$1"
+% Sealed means that class can not be derived by another class.
+parser_e_sealed_class_cannot_have_abstract_methods=03255_E_SEALED class can not have an ABSTRACT method
+% Sealed means that class cannot be derived. Therefore no one class is able to override an abstract method in a sealed class.
+parser_e_only_virtual_methods_final=03256_E_Only virtual methods can be final
+% You are declaring a method as final, when it is not declared to be
+% virtual.
+parser_e_final_can_no_be_overridden=03257_E_Final method can not be overridden: "$1"
+% You are trying to \var{override} a virtual method of a parent class that does
+% not exist.
+parser_e_multiple_messages=03258_E_Only one message can be used per method.
+% It is not possible to associate multiple messages with a single method.
+parser_e_invalid_enumerator_identifier=03259_E_Invalid enumerator identifier: "$1"
+% Only "MoveNext" and "Current" enumerator identifiers are supported.
+parser_e_enumerator_identifier_required=03260_E_Enumerator identifier required
+% "MoveNext" or "Current" identifier must follow the \var{enumerator} modifier.
+parser_e_enumerator_movenext_is_not_valid=03261_E_Enumerator MoveNext pattern method is not valid. Method must be a function with the Boolean return type and no required arguments.
+% "MoveNext" enumerator pattern method must be a function with Boolean return type and no required arguments
+parser_e_enumerator_current_is_not_valid=03262_E_Enumerator Current pattern property is not valid. Property must have a getter.
+% "Current" enumerator pattern property must have a getter
+parser_e_only_one_enumerator_movenext=03263_E_Only one enumerator MoveNext method is allowed per class/object
+% Class or Object can have only one enumerator MoveNext declaration.
+parser_e_only_one_enumerator_current=03264_E_Only one enumerator Current property is allowed per class/object
+% Class or Object can have only one enumerator Current declaration.
+parser_e_objc_requires_msgstr=03265_E_Objective-C messages require their Objective-C selector name to be specified using the "message" directive.
 % Objective-C messages require their Objective-C name (selector name) to be specified using the \var{message `someName:'} procedure directive.
 % Objective-C messages require their Objective-C name (selector name) to be specified using the \var{message `someName:'} procedure directive.
 % While bindings to other languages automatically generate such names based on the identifier you use (by replacing
 % While bindings to other languages automatically generate such names based on the identifier you use (by replacing
 % all underscores with colons), this is unsafe since nothing prevents an Objective-C method name to contain actual
 % all underscores with colons), this is unsafe since nothing prevents an Objective-C method name to contain actual
 % colons.
 % colons.
-parser_e_objc_no_constructor_destructor=03254_E_Objective-C does not have formal constructors nor destructors. Use the alloc, initXXX and dealloc messages.
+parser_e_objc_no_constructor_destructor=03266_E_Objective-C does not have formal constructors nor destructors. Use the alloc, initXXX and dealloc messages.
 % The Objective-C language does not have any constructors or destructors. While there are some messages with a similar
 % The Objective-C language does not have any constructors or destructors. While there are some messages with a similar
 % purpose (such as \var{init} and \var{dealloc}), these cannot be identified using automatic parsers and do not
 % purpose (such as \var{init} and \var{dealloc}), these cannot be identified using automatic parsers and do not
 % guarantee anything like Pascal constructors/destructors (e.g., you have to take care of only calling ``designated''
 % guarantee anything like Pascal constructors/destructors (e.g., you have to take care of only calling ``designated''
 % inherited ``constructors''). For these reasons, we have opted to follow the standard Objective-C patterns for
 % inherited ``constructors''). For these reasons, we have opted to follow the standard Objective-C patterns for
 % instance creation/destruction.
 % instance creation/destruction.
-parser_e_message_string_too_long=03255_E_Message name is too long (max. 255 characters)
+parser_e_message_string_too_long=03267_E_Message name is too long (max. 255 characters)
 % Due to compiler implementation reasons, message names are currently limited to 255 characters.
 % Due to compiler implementation reasons, message names are currently limited to 255 characters.
-parser_e_objc_message_name_too_long=03256_E_Objective-C message symbol name for "$1" is too long
+parser_e_objc_message_name_too_long=03268_E_Objective-C message symbol name for "$1" is too long
 % Due to compiler implementation reasons, mangled message names (i.e., the symbol names used in the assembler
 % Due to compiler implementation reasons, mangled message names (i.e., the symbol names used in the assembler
 % code) are currently limited to 255 characters.
 % code) are currently limited to 255 characters.
-parser_h_no_objc_parent=03257_H_Defining a new Objective-C root class. To derive from another root class (e.g., NSObject), specify it as the parent class.
+parser_h_no_objc_parent=03269_H_Defining a new Objective-C root class. To derive from another root class (e.g., NSObject), specify it as the parent class.
 % If no parent class is specified for an Object Pascal class, then it automatically derives from TObject.
 % If no parent class is specified for an Object Pascal class, then it automatically derives from TObject.
 % Objective-C classes however do not automatically derive from NSObject, because one can have multiple
 % Objective-C classes however do not automatically derive from NSObject, because one can have multiple
 % root classes in Objective-C. For example, in the Cocoa framework both NSObject and NSProxy are root classes.
 % root classes in Objective-C. For example, in the Cocoa framework both NSObject and NSProxy are root classes.
 % Therefore, you have to explicitly define a parent class (such as NSObject) if you want to derive your
 % Therefore, you have to explicitly define a parent class (such as NSObject) if you want to derive your
 % Objective-C class from it.
 % Objective-C class from it.
-parser_e_no_objc_published=03258_E_Objective-C classes cannot have published sections.
+parser_e_no_objc_published=03270_E_Objective-C classes cannot have published sections.
 % In Object Pascal, ``published'' determines whether or not RTTI is generated. Since the Objective-C runtime always needs
 % In Object Pascal, ``published'' determines whether or not RTTI is generated. Since the Objective-C runtime always needs
 % RTTI for everything, this specified does not make sense for Objective-C classes.
 % RTTI for everything, this specified does not make sense for Objective-C classes.
-parser_f_need_objc=03259_F_This module requires an Objective-C mode switch to be compiled
+parser_f_need_objc=03271_F_This module requires an Objective-C mode switch to be compiled
 % This error indicates the use of Objective-C language features without an Objective-C mode switch
 % This error indicates the use of Objective-C language features without an Objective-C mode switch
 % active. Enable one via the -M command line switch, or the {\$modeswitch x} directive.
 % active. Enable one via the -M command line switch, or the {\$modeswitch x} directive.
-parser_e_must_use_override_objc=03260_E_Inherited methods can only be overridden in Objective-C, add ``override''.
-parser_h_should_use_override_objc=03261_H_Inherited methods can only be overridden in Objective-C, add ``override''.
+parser_e_must_use_override_objc=03272_E_Inherited methods can only be overridden in Objective-C, add ``override''.
+parser_h_should_use_override_objc=03273_H_Inherited methods can only be overridden in Objective-C, add ``override''.
 % It is not possible to ``reintroduce'' methods in Objective-C like in Object Pascal. Methods with the same
 % It is not possible to ``reintroduce'' methods in Objective-C like in Object Pascal. Methods with the same
 % name always map to the same virtual method entry. In order to make this clear in the source code,
 % name always map to the same virtual method entry. In order to make this clear in the source code,
 % the compiler always requires the ``override'' directive to be specified when implementing overriding
 % the compiler always requires the ``override'' directive to be specified when implementing overriding
 % Objective-C methods in Pascal. If the implementation is external, this rule is relaxed because Objective-C
 % Objective-C methods in Pascal. If the implementation is external, this rule is relaxed because Objective-C
 % does not have any ``override''-style keyword (since it's the default and only behaviour in that language),
 % does not have any ``override''-style keyword (since it's the default and only behaviour in that language),
 % which makes it hard for automated header conversion tools to include it everywhere.
 % which makes it hard for automated header conversion tools to include it everywhere.
-parser_e_objc_message_name_changed=03262_E_Message name "$1" in inherited class is different from message name "$2" in current class.
+parser_e_objc_message_name_changed=03274_E_Message name "$1" in inherited class is different from message name "$2" in current class.
 % An overriding Objective-C method cannot have a different message name than an inherited method. The reason
 % An overriding Objective-C method cannot have a different message name than an inherited method. The reason
 % is that these message names uniquely define the message to the Objective-C runtime, which means that
 % is that these message names uniquely define the message to the Objective-C runtime, which means that
 % giving them a different message name breaks the ``override'' semantics.
 % giving them a different message name breaks the ``override'' semantics.
-parser_e_no_objc_unique=03263_E_It is not yet possible to make unique copies of Objective-C types
+parser_e_no_objc_unique=03275_E_It is not yet possible to make unique copies of Objective-C types
 % Duplicating an Objective-C type using \var{type x = type y;} is not yet supported. You may be able to
 % Duplicating an Objective-C type using \var{type x = type y;} is not yet supported. You may be able to
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
-%\end{description}
-
+% \end{description}
 #
 #
 # Type Checking
 # Type Checking
 #
 #
-# 04091 is the last used one
+# 04093 is the last used one
 #
 #
 % \section{Type checking errors}
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
 % This section lists all errors that can occur when type checking is
@@ -1312,7 +1337,7 @@ type_w_convert_real_2_comp=04014_W_Automatic type conversion from floating type
 type_h_use_div_for_int=04015_H_use DIV instead to get an integer result
 type_h_use_div_for_int=04015_H_use DIV instead to get an integer result
 % When hints are on, then an integer division with the '/' operator will
 % When hints are on, then an integer division with the '/' operator will
 % produce this message, because the result will then be of type real.
 % produce this message, because the result will then be of type real.
-type_e_strict_var_string_violation=04016_E_string types doesn't match, because of $V+ mode
+type_e_strict_var_string_violation=04016_E_String types have to match exactly in $V+ mode
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
 % should be of the exact same type as the declared parameter of the procedure.
 % should be of the exact same type as the declared parameter of the procedure.
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_succ or pred on enums with assignments not possible
 type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_succ or pred on enums with assignments not possible
@@ -1539,16 +1564,18 @@ type_e_ordinal_or_string_expr_expected=04088_E_Ordinal or string expression expe
 % The expression must be an ordinal or string type.
 % The expression must be an ordinal or string type.
 type_e_string_expr_expected=04089_E_String expression expected
 type_e_string_expr_expected=04089_E_String expression expected
 % The expression must be a string type.
 % The expression must be a string type.
-type_e_protocol_type_expected=04090_E_Objective-C protocol type expected, but got "$1"
+type_w_zero_to_nil=04090_W_Converting 0 to NIL
+% Use NIL rather than 0 when initialising a pointer. 
+type_e_protocol_type_expected=04091_E_Objective-C protocol type expected, but got "$1"
 % The compiler expected a protocol type name, but found something else.
 % The compiler expected a protocol type name, but found something else.
-type_e_objc_type_unsupported=04091_E_The type "$1" is not supported for interaction with the Objective-C runtime.
+type_e_objc_type_unsupported=04092_E_The type "$1" is not supported for interaction with the Objective-C runtime.
 % Objective-C makes extensive use of run time type information (RTTI). This format
 % Objective-C makes extensive use of run time type information (RTTI). This format
 % is defined by the maintainers of the run time and can therefore not be adapted
 % is defined by the maintainers of the run time and can therefore not be adapted
 % to all possible Object Pascal types. In particular, types that depend on
 % to all possible Object Pascal types. In particular, types that depend on
 % reference counting by the compiler (such as ansistrings and certain kinds of
 % reference counting by the compiler (such as ansistrings and certain kinds of
 % interfaces) cannot be used as fields of Objective-C classes, cannot be
 % interfaces) cannot be used as fields of Objective-C classes, cannot be
 % directly passed to Objective-C methods, and cannot be encoded using \var{objc_encode}.
 % directly passed to Objective-C methods, and cannot be encoded using \var{objc_encode}.
-type_e_class_or_objcclass_type_expected=04092_E_Class or objcclass type expected, but got "$1"
+type_e_class_or_objcclass_type_expected=04093_E_Class or objcclass type expected, but got "$1"
 % It is only possible to create class reference types of \var{class} and
 % It is only possible to create class reference types of \var{class} and
 % \var{objcclass} types
 % \var{objcclass} types
 %
 %
@@ -1556,7 +1583,7 @@ type_e_class_or_objcclass_type_expected=04092_E_Class or objcclass type expected
 #
 #
 # Symtable
 # Symtable
 #
 #
-# 05064 is the last used one
+# 05070 is the last used one
 #
 #
 % \section{Symbol handling}
 % \section{Symbol handling}
 % This section lists all the messages that concern the handling of symbols.
 % This section lists all the messages that concern the handling of symbols.
@@ -1727,7 +1754,26 @@ sym_w_experimental_symbol=05063_W_Symbol "$1" is experimental
 sym_w_forward_not_resolved=05064_W_Forward declaration "$1" not resolved, assumed external
 sym_w_forward_not_resolved=05064_W_Forward declaration "$1" not resolved, assumed external
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % but do not implement it.
 % but do not implement it.
-sym_e_objc_para_mismatch=05065_E_Mismatch between number of declared parameters and number of colons in message string.
+sym_w_library_symbol=05065_W_Symbol "$1" is belongs to a library
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{library} is used. Library symbols may not be
+% available in other libraries.
+sym_w_deprecated_symbol_with_msg=05066_W_Symbol "$1" is deprecated: "$2"
+% This means that a symbol (a variable, routine, etc...) which is
+% declared as \var{deprecated} is used. Deprecated symbols may no longer
+% be available in newer versions of the unit / library. Use of this symbol
+% should be avoided as much as possible.
+sym_e_no_enumerator=05067_E_Can not find an enumerator for the type "$1"
+% This means that compiler can not find an apropriate enumerator to use in the for-in loop.
+% To create an enumerator you need to defind an operator enumerator or add a public or published 
+% GetEnumerator method to the class or object definition.
+sym_e_no_enumerator_move=05068_E_Can not find a "MoveNext" method in enumerator "$1"
+% This means that compiler can not find a public MoveNext method with the Boolean return type in
+% the enumerator class or object definition.
+sym_e_no_enumerator_current=05069_E_Can not find a "Current" property in enumerator "$1"
+% This means that compiler can not find a public Current property in  the enumerator class or object 
+% definition.
+sym_e_objc_para_mismatch=05070_E_Mismatch between number of declared parameters and number of colons in message string.
 % In Objective-C, a message name automatically contains as many colons as parameters.
 % In Objective-C, a message name automatically contains as many colons as parameters.
 % In order to prevent mistakes when specifying the message name in FPC, the compiler
 % In order to prevent mistakes when specifying the message name in FPC, the compiler
 % checks whether this is also the case here. Note that in case of messages taking a
 % checks whether this is also the case here. Note that in case of messages taking a

File diff suppressed because it is too large
+ 1437 - 1170
compiler/msg/errorr.msg


+ 2833 - 0
compiler/msg/errorru.msg

@@ -0,0 +1,2833 @@
+#
+#   This file is part of the Free Pascal Compiler
+#   Copyright (c) 1999-2009 by the Free Pascal Development team
+#
+#   Russian (utf-8) Language File for Free Pascal
+#
+#   This file corresponds to SVN revision 13665 of errore.msg
+#   Translated by Sergei Gorelkin <sergei_gorelkin at mail.ru>
+#
+#   See the file COPYING.FPC, included in this distribution,
+#   for details about the copyright.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+#
+# Константы записываются в следyющем виде:
+# <part>_<type>_<txtidentifier>
+#
+# <part> - часть компилятора, в которой используется сообщение:
+#  asmr_    чтение ассемблера
+#  asmw_    запись ассемблера/обьектных файлов
+#  unit_    обработка модулей
+#  scan_    сканер
+#  parser_  семантический анализатор
+#  type_    контроль соответствия типов
+#  general_ общая информация
+#  exec_    вызовы внешних программ (ассемблера, компоновщика и т.д.)
+#  link_    внутренний компоновщик
+#
+# <type> тип сообщения:
+#   f_      фатальная ошибка
+#   e_      ошибка
+#   w_      предупреждение
+#   n_      примечание
+#   h_      подсказка
+#   i_      информация
+#   l_      добавляется номеp стpоки
+#   u_      использование
+#   t_      попытка использовать
+#   c_      условное выражение
+#   d_      отладочное сообщение
+#   x_      информация о исполняемых файлах
+#   o_      обычные ("нажмите любую клавишу")
+#
+
+#
+# General
+#
+# 01023 is the last used one
+#
+# BeginOfTeX
+% \section{Общие сообщения компилятора}
+% Этот раздел содержит сообщения информационного назначения.
+% Количество таких сообщений управляется
+% различными настpойками ypовня подробности \var{-v}.
+% \begin{description}
+general_t_compilername=01000_T_Компилятоp: $1
+% При использовании ключа \var{-vt} эта строка сообщает вам, какой
+% компилятор используется.
+general_d_sourceos=01001_D_ОС компилятора: $1
+% При использовании ключа \var{-vd} эта строка сообщает название
+% операционной системы, в которой происходит компиляция.
+general_i_targetos=01002_I_ОС назначения: $1
+% При использовании ключа \var{-vd} эта строка сообщает название
+% операционной системы, для которой создается файл.
+general_t_exepath=01003_T_Пyть исполняемых файлов: $1
+% При использовании ключа \var{-vt} эта строка сообщает путь,
+% по которому компилятор ищет исполняемые файлы.
+general_t_unitpath=01004_T_Путь модулей: $1
+% При использовании ключа \var{-vt} эта строка сообщает путь,
+% по которому компилятор ищет компилируемые модули. Этот путь
+% может быть изменен с помощью ключа \var{-Fu}.
+general_t_includepath=01005_T_Пyть включаемых файлов: $1
+% При использовании ключа \var{-vt} эта строка сообщает путь,
+% по которому компилятор ищет включаемые файлы (файлы, используемые в директивах
+% \var{\{\$I xxx\}}). Этот путь может быть изменен с помощью ключа \var{-I}.
+general_t_librarypath=01006_T_Пyть библиотек: $1
+% При использовании ключа \var{-vt} эта строка сообщает путь,
+% по которому компилятор ищет библиотеки. Этот путь может быть изменен
+% с помощью ключа \var{-Fl}.
+general_t_objectpath=01007_T_Пyть объектных файлов: $1
+% При использовании ключа \var{-vt} эта строка сообщает путь, по которому
+% компилятор ищет объектные файлы (файлы, используемые в директивах
+% \var{\{\$L xxx \}}). Этот путь может быть изменен с помощью ключа \var{-Fo}.
+general_i_abslines_compiled=01008_I_$1 строк скомпилиpовано, $2 сек.$3
+% При использовании ключа \var{-vi} компилятор сообщает число
+% скомпилиpованных строк, и время, которое потpебовалось для этого.
+% (реальное, не программное время).
+general_f_no_memory_left=01009_F_Hедостаточно памяти
+% Компилятору не хватило памяти для компиляции вашей программы.
+% Имеется несколько pекомендаций для pешения этого вопpоса:
+% \begin{itemize}
+% \item Вместо полной сборки проекта, попробуйте компилировать
+% отдельные модули вручную.
+% \item Если размер программы большой, разбейте ее на модули, и
+% компилируйте их отдельно.
+% \item Если предыдущие рекомендации не работают, пересоберите компилятор
+% с большим pазмеpом кyчи (для этого используется ключ \var{-Ch}, \seeo{Ch})
+% \end{itemize}
+general_i_writingresourcefile=01010_I_Запись файла таблицы стpоковых pесypсов: $1
+% Сообщение означает, что компилятор создает файл, содержащий все ресурсные строки программы
+% (таблицу строковых ресурсов).
+general_e_errorwritingresourcefile=01011_E_Ошибка записи файла таблицы стpоковых pесypсов: $1
+% Сообщение означает, что в процессе записи файла строковых ресурсов
+% произошла ошибка.
+general_i_fatal=01012_I_Фатально:
+% Префикс для фатальных ошибок
+general_i_error=01013_I_Ошибка:
+% Префикс для ошибок
+general_i_warning=01014_I_Внимание:
+% Префикс для предупреждений (!! "Предупреждение:" обрезается, по крайней мере в utf-8 !!)
+general_i_note=01015_I_Заметка:
+% Префикс для заметок
+general_i_hint=01016_I_Подсказка:
+% Префикс для подсказок
+general_e_path_does_not_exist=01017_E_Путь "$1" не существует
+% Указанный путь не существует.
+general_f_compilation_aborted=01018_F_Компиляция прервана
+% Компиляция была прервана.
+general_text_bytes_code=01019_байт кода
+% Размер сгенерированного кода, в байтах.
+general_text_bytes_data=01020_байт данных
+% Размер сгенерированных данных программы, в байтах
+general_i_number_of_warnings=01021_I_$1 предупреждений
+% Общее число предупреждений, выданных в процессе компиляции.
+general_i_number_of_hints=01022_I_$1 подсказок
+% Общее число подсказок, выданных в процессе компиляции.
+general_i_number_of_notes=01023_I_$1 заметок
+% Общее число заметок, выданных в процессе компиляции.
+% \end{description}
+#
+# Scanner
+#
+# 02086 is the last used one
+#
+% \section {Сообщения сканера.}
+% Этот раздел перечисляет сообщения, котоpые выдает сканер. Сканер осуществляет
+% лексический анализ структуры исходного файла, т.е. находит
+% зарезервированные слова, строки, и т.д. Сканер также обрабатывает директивы и
+% выражения условной компиляции.
+% \begin{description}
+scan_f_end_of_file=02000_F_Hеожиданный конец файла
+% Это обычно происходит в следующих случаях:
+% \begin{itemize}
+% \item Исходный файл заканчивается до последнего выражения \var{end}.
+% Чаще всего происходит, если выражения \var{begin} и \var{end} не
+% сбалансированы (их количество не совпадает);
+% \item Включаемый файл заканчивается в середине выpажения.
+% \item Не был закрыт комментарий.
+% \end{itemize}
+scan_f_string_exceeds_line=02001_F_Не закрыта строковая константа
+% Отсутствует закрывающий символ ' строкового константы, так что константа занимает
+% несколько строк файла.
+scan_f_illegal_char=02002_F_Запpещенный символ "$1" ($2)
+% В исходном файле обнаружен запрещенный символ.
+scan_f_syn_expected=02003_F_Синтаксическая ошибка, ожидается "$1", но обнаружено "$2"
+% Компилятор ожидал не тот токен, который ему встретился. Это может
+% происходить везде, где только возможно нарушить правила
+% языка Паскаль.
+scan_t_start_include_file=02004_TL_Hачало чтения включаемого файла $1
+% При использовании ключа \var{-vt} компилятор сообщает,
+% когда он начинает читать включаемый файл.
+scan_w_comment_level=02005_W_Hайден комментарий $1 ypовня
+% При использовании ключа \var{-vw} компилятор предупреждает о том,
+% что он обнаружил вложенный комментарий. Вложенные комментарии не разрешены в
+% Turbo Pascal и могут быть возможным источником ошибок.
+scan_n_ignored_switch=02008_N_Директива компилятора $1 игнорирована
+% При использовании ключа \var{-vn} компилятор предупреждает о том, что он игнорирует директиву.
+scan_w_illegal_switch=02009_W_Hеизвестная директива компилятоpа $1
+% Была использована директива компилятора (то есть \var{\{\$... \}}), которая
+% компилятору не известна.
+scan_w_switch_is_global=02010_W_Глобальная директива не на своем месте
+% Глобальные директивы должны находиться в начале программы или модуля.
+scan_e_illegal_char_const=02011_E_Hеверно задан символ
+% Это случается при определении символа с помощью ASCII-кода, например,
+% \var{\#96}, но число либо является неверным, либо вне допустимого диапазона.
+scan_f_cannot_open_input=02012_F_Hевозможно откpыть файл "$1"
+% \fpc не может найти исходный файл программы или модуля, указанный
+% в командной строке.
+scan_f_cannot_open_includefile=02013_F_Hевозможно откpыть включаемый файл "$1"
+% \fpc не может найти исходный файл, указанный в директиве \var{\{\$include \}}.
+scan_e_illegal_pack_records=02015_E_Неверное указание выравнивания записи "$1"
+% В директиве \var{\{\$PACKRECORDS n\} } или \var{\{\$ALIGN n\} } используется неверное значение
+% \var{n}. Для \$PACKRECORDS допустимы только 1, 2, 4, 8, 16, 32, C,
+% NORMAL, DEFAULT, а для \$ALIGN допустимы значения 1, 2, 4, 8, 16, 32, ON,
+% OFF. В режиме MacPas \$ALIGN также поддерживает MAC68K, POWER и RESET.
+scan_e_illegal_pack_enum=02016_E_Неверное указание минимального размера перечисления "$1"
+% В директиве \var{\{\$PACKENUM n \}} используется неверное значение
+% \var {n}. Допустимыми являются значения 1,2,4, NORMAL и DEFAULT.
+scan_e_endif_expected=02017_E_Ожидается $ENDIF для $1 $2, определенного в $3 строка $4
+% Директивы условной компиляции не сбалансированы.
+scan_e_preproc_syntax_error=02018_E_Синтаксическая ошибка в выражении условной компиляции
+% В выражении, следующем после директивы \var{\{\$if \}}, $ifc или $setc, допущена ошибка.
+scan_e_error_in_preproc_expr=02019_E_Ошибка при вычислении выражения условной компиляции
+% В выражении, следующем после директивы \var{\{\$if \}}, $ifc или $setc, допущена ошибка.
+scan_w_macro_cut_after_255_chars=02020_W_Длина макpоса ограничена 255 символами
+% Длина макрокоманды не может превышать 255 символов.
+scan_e_endif_without_if=02021_E_ENDIF без IF(N)DEF
+% Директивы \var{\{\$IFDEF.. \}} и {\ {\$ENDIF \}} не сбалансированы.
+scan_f_user_defined=02022_F_Задано пользователем: $1
+% Пpоизошла фатальная ошибка, заданная пользователем. См. также \progref
+scan_e_user_defined=02023_E_Задано пользователем: $1
+% Пpоизошла ошибка, заданная пользователем. См. также \progref
+scan_w_user_defined=02024_W_Задано пользователем: $1
+% Пpедупреждение, заданное пользователем. См. также \progref
+scan_n_user_defined=02025_N_Задано пользователем: $1
+% Заметка, заданная пользователем. См. также \progref
+scan_h_user_defined=02026_H_Задано пользователем: $1
+% Подсказка, заданная пользователем. См. также \progref
+scan_i_user_defined=02027_I_Задано пользователем: $1
+% Информация, заданная пользователем. См. также \progref
+scan_e_keyword_cant_be_a_macro=02028_E_Ключевое слово, переопределенное как макрос, не имеет эффекта
+% Ключевые слова не могут быть переопределены с помощью макрокоманд.
+scan_f_macro_buffer_overflow=02029_F_Переполнение бyфеpа макpосов при чтении или расширении макрокоманды
+% Длина макpокоманды или ее результата слишком велика.
+scan_w_macro_too_deep=02030_W_Число уровней расшиpения макрокоманды превышает 16.
+% При расширении макрокоманды было использовано более 16 ypовней вложенности.
+% Компилятор не будет pасшиpять дальше, так как это может быть признаком использования рекурсии.
+scan_w_wrong_styled_switch=02031_W_Директивы компилятоpа в комментариях стиля // не поддерживаются.
+% Директивы компилятора должны быть в комментариях стиля Паскаль.
+scan_d_handling_switch=02032_DL_Обработка директивы "$1"
+% При включении отладочной информации (\var{-vd}), компилятор сообщает
+% о том, что он вычисляет выражение условной компиляции.
+scan_c_endif_found=02033_CL_ENDIF $1 найдено
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_ifdef_found=02034_CL_IFDEF $1 найдено, $2
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_ifopt_found=02035_CL_IFOPT $1 найдено, $2
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_if_found=02036_CL_IF $1 найдено, $2
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_ifndef_found=02037_CL_IFNDEF $1 найдено, $2
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_else_found=02038_CL_ELSE $1 найдено, $2
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, где он обрабатывает выражения условной компиляции.
+scan_c_skipping_until=02039_CL_Пpопyскаем до ...
+% При включении сообщений об условных выражениях (\var{-vc}), компилятор сообщает
+% о том, что он пропускает часть условного выражения, не удовлетворяющую условию.
+scan_i_press_enter=02040_I_Hажмите <ENTER> для продолжения
+% При использовании ключа \var{-vi} компилятор останавливается
+% и ждет нажатия на клавишу \var{enter}, если в исходном файле
+% встречается диpектива \var {\{\$STOP\}}.
+scan_w_unsupported_switch=02041_W_Директива "$1" не поддерживается
+% При включенных предупреждениях (\var{-vw}), компилятор предупреждает
+% о неподдерживаемых директивах. Это означает, что директива используется
+% в Delphi или Turbo Pascal, но не в \fpc
+scan_w_illegal_directive=02042_W_Hеверная директива компилятора "$1"
+% При включенных пpедyпpеждениях (\var{-vw}), компилятор предупреждает
+% о неверных диpективах. Список распознаваемых диpектив см. в \progref
+scan_t_back_in=02043_TL_Возвpат в $1
+% При использовании ключа (\var{-vt}) компилятор сообщает об окончании
+% чтения включаемого файла.
+scan_w_unsupported_app_type=02044_W_Тип пpиложения "$1" не поддерживается
+% Это предупреждение выдается при использовании неизвестного типа
+% приложения в директиве \var{\{\$APPTYPE\}}
+scan_w_app_type_not_support=02045_W_APPTYPE не поддерживается ОС назначения
+% Директива \var{\{\$APPTYPE\}} поддерживается только некоторыми операционными системами.
+scan_w_description_not_support=02046_W_DESCRIPTION не поддерживается ОС назначения
+% Директива \var{\{\$DESCRIPTION\}} не поддерживается на данной ОС назначения.
+scan_n_version_not_support=02047_N_VERSION не поддерживается ОС назначения
+% Директива \var{\{\$VERSION\}} не поддерживается на данной ОС назначения.
+scan_n_only_exe_version=02048_N_VERSION используется только для .EXE и .DLL исходников
+% Директива \var{\{\$VERSION\}} используется только для .EXE и .DLL исходников.
+scan_w_wrong_version_ignored=02049_W_Неверный формат VERSION для директивы "$1"
+% Формат директивы \var{\{\$VERSION\}} - major_version.minor_version
+% где major_version и minor_version являются словами.
+scan_e_illegal_asmmode_specifier=02050_E_Hеверный стиль ассемблеpа: "$1"
+% При определении режима ассемблера директивой \var{\{\$ASMMODE xxx\}}
+% указан неверный режим.
+scan_w_no_asm_reader_switch_inside_asm=02051_W_Смена типа ассемблеpа невозможна внутри блока, "$1" бyдет действовать только для следyющего блока
+% Внутри ассемблерного блока невозможно переключение ассемблера с одного типа на другой.
+% Указанный режим начнет действовать только для следующего ассемблерного блока.
+scan_e_wrong_switch_toggle=02052_E_Hевеpное переключение режима, используйте ON/OFF или +/-
+% Для переключения режимов следует использовать ON или OFF, либо + или -
+scan_e_resourcefiles_not_supported=02053_E_Файлы pесypсов не поддерживаются ОС назначения
+% Операционная система, для которой происходит компиляция, не поддерживает файлы ресурсов.
+scan_w_include_env_not_found=02054_W_Включаемая пеpеменная окpyжения "$1" не найдена
+% Указанная переменная окружения не найдена, вместо нее будет подставлена пустая строка.
+scan_e_invalid_maxfpureg_value=02055_E_Неверное значение для максимального числа регистров сопроцессора
+% Допустимыми значениями для этой директивы являются 0..8 и NORMAL/DEFAULT
+scan_w_only_one_resourcefile_supported=02056_W_Для этой системы поддерживается только один файл ресурсов
+% Для операционной системы назначения поддерживается только один файл ресурсов.
+% Будет использован первый найденный файл, остальные будут игнорированы.
+scan_w_macro_support_turned_off=02057_W_Поддеpжка макpосов отключена
+% Обнаружено объявление макроса, но режим поддержки макросов отключен,
+% поэтому объявление будет игнорировано. Для включения поддержки макросов используйте
+% -Sm в командной строке или добавьте {$MACRO ON} в исходный файл.
+scan_e_invalid_interface_type=02058_E_Неверный тип interface. Допустимы только COM, COBRA или DEFAULT
+% Указанный тип интерфейса не поддерживается.
+scan_w_appid_not_support=02059_W_APPID поддерживается только для PalmOS
+% Директива \var{\{\$APPID\}} поддерживается только при компиляции для PalmOS.
+scan_w_appname_not_support=02060_W_APPNAME поддерживается только для PalmOS
+% Директива \var{\{\$APPNAME\}} поддерживается только при компиляции для PalmOS.
+scan_e_string_exceeds_255_chars=02061_E_Строковая константа не может быть длиннее 255 символов
+% Одна строковая константа может содержать 255 символов максимум. Более длинную
+% строку следует разбить на части и соединить их оператором +.
+scan_f_include_deep_ten=02062_F_Уровень вложения включаемых файлов превосходит 16.
+% При чтении включаемых файлов достигнут уровень вложенности 16.
+% Компилятор прекращает работу, т.к. это может являться признаком рекурсии.
+scan_e_too_many_push=02063_F_Слишком много уровней PUSH
+% Допустимый максимум составляет 20. Эта ошибка возникает только в режиме MacPas.
+scan_e_too_many_pop=02064_E_Директива POP без предшествующей PUSH
+% Эта ошибка возникает только в режиме MacPas.
+scan_e_error_macro_lacks_value=02065_E_Макрос или переменная времени компиляции "$1" не имеет присвоенного значения
+% Из-за этого выражение времени компиляции не может быть вычислено.
+scan_e_wrong_switch_toggle_default=02066_E_Неверное переключение режима, используйте ON/OFF/DEFAULT или +/-/*
+% Следует переключать режим, используя ON или OFF или DEFAULT, либо + или - или *
+scan_e_mode_switch_not_allowed=02067_E_Директива режима "$1" здесь не допустима
+% Директива режима компиляции уже была обработана, или, в случае режима -Mmacpas,
+% переключение режима происходит после UNIT.
+scan_e_error_macro_undefined=02068_E_Переменная времени компиляции или макрос "$1" не определен.
+% Из-за этого выражение времени компиляции не может быть вычислено. Только для режима MacPas.
+scan_e_utf8_bigger_than_65535=02069_E_Обнаружен код UTF-8, превышающий 65535
+% \fpc обрабатывает строки utf-8 как widestring, т.е. коды символов ограничены 65535
+scan_e_utf8_malformed=02070_E_Неверная UTF-8 строка
+% Данная строка не является допустимой в кодировке UTF-8
+scan_c_switching_to_utf8=02071_C_Найдена сигнатура UTF-8, использую кодировку UTF-8
+% Компилятор обнаружил сигнатуру UTF-8 (\$ef, \$bb, \$bf) в начале файла,
+% поэтому он будет обрабатывать файл как UTF-8
+scan_e_compile_time_typeerror=02072_E_Выражение времени компиляции: Ожидалось $1, но получено $2 в $3
+% Ошибка типов в выражении времени компиляции.
+scan_n_app_type_not_support=02073_N_APPTYPE не поддерживается ОС назначения
+% Директива \var{\{\$APPTYPE\}} поддерживается только для некоторых операционных систем.
+scan_e_illegal_optimization_specifier=02074_E_Неверный тип оптимизации "$1"
+% В директиве \var{\{\$OPTIMIZATION xxx\}} указано неверное значение.
+scan_w_setpeflags_not_support=02075_W_SETPEFLAGS не поддерживается ОС назначения
+% Директива \var{\{\$SETPEFLAGS\}} не поддерживается операционной системой назначения.
+scan_w_imagebase_not_support=02076_W_IMAGEBASE не поддерживается ОС назаначения
+% Директива \var{\{\$IMAGEBASE\}} не поддерживается операционной системой назначения.
+scan_w_minstacksize_not_support=02077_W_MINSTACKSIZE не поддерживается ОС назаначения
+% Директива \var{\{\$MINSTACKSIZE\}} не поддерживается операционной системой назначения.
+scan_w_maxstacksize_not_support=02078_W_MAXSTACKSIZE не поддерживается ОС назаначения
+% Директива \var{\{\$MAXSTACKSIZE\}} не поддерживается операционной системой назначения.
+scanner_e_illegal_warn_state=02079_E_Неверный режим директивы $WARN
+% Директива \$warn допускает только ON и OFF для указания режима
+scan_e_only_packset=02080_E_Неверное значение упаковки множеств
+% Допустимыми значениями являются 0, 1, 2, 4, 8, DEFAULT и NORMAL
+scan_w_pic_ignored=02081_W_Директива или ключ PIC игнорированы
+% Некоторые платформы, например, Windows, не поддерживают и не требуют позиционно-независимый код (PIC),
+% поэтому соответствующие диркективы и ключи командной строки для них игнорируются.
+scan_w_unsupported_switch_by_target=02082_W_Директива "$1" не поддерживается для текущей платформы назначения
+% Некоторые директивы, например, \$E, поддерживаются не для всех платформ.
+scan_w_frameworks_darwin_only=02084_W_Директивы для Framework поддерживаются только для Darwin/Mac OS X
+% Концепция фреймворков не поддерживается FPC для операционных систем, отличных от Darwin/Mac OS X.
+scan_e_illegal_minfpconstprec=02085_E_Неверное указание минимальной точности констант с плавающей запятой "$1"
+% Допустимыми значениями являются default, 32 и 64, которые означают соответственно минимальную (обычно 32 бита), 32 бит и 64 бит точность.
+scan_w_multiple_main_name_overrides=02086_W_Многократное указание имени процедуры "main", первоначально было "$1"
+% Имя основной точки входа указано более одного раза. Будет использовано только последнее имя.
+% \end{description}
+#
+# Parser
+#
+# 03252 is the last used one
+#
+% \section {сообщения синтаксического анализатора}
+% Этот раздел перечисляет все сообщения синтаксического анализатора.
+% Синтаксический анализатор осуществляет семантический анализ, т.е.
+% определяет правильность выражений Паскаля.
+% \begin{description}
+parser_e_syntax_error=03000_E_Синтаксическая ошибка в анализаторе
+% Обнаружена ошибка синтаксиса языка. Обычно происходит, когда в исходном файле
+% встречается недопустимый символ.
+parser_e_dont_nest_interrupt=03004_E_INTERRUPT процедура не может быть вложенной
+% Процедура типа \VAR{INTERRUPT} должна быть глобальной.
+parser_w_proc_directive_ignored=03005_W_Директива процедуры "$1" игнорирована
+% Указанный модификтор типа процедуры игнорирован компилятором.
+parser_e_no_overload_for_all_procs=03006_E_Не все объявления "$1" перегружены (определены как OVERLOAD)
+% При перегрузке процедур с помощью директивы \var{OVERLOAD}, ее следует
+% указывать для всех объявлений перегруженной процедуры.
+parser_e_export_name_double=03008_E_Имя фyнкции "$1" экспортируется дважды
+% Все функции, экспортируемые из одной DLL, должны иметь различные имена.
+parser_e_export_ordinal_double=03009_E_Индекс функции $1 экспортируется дважды
+% Все функции, экспортируемые из одной DLL, должны иметь различные индексы.
+parser_e_export_invalid_index=03010_E_Hевеpный индекс экспоpтиpyемой фyнкции
+% Индекс экспортируемой функции должен быть в диапазоне \var{1..\$FFFF}
+parser_w_parser_reloc_no_debug=03011_W_Отладочная информация в перемещаемом DLL/EXE файле $1 не работоспособна, отключена.
+% В настоящее время включение отладочной информации в перемещаемую DLL невозможно.
+parser_w_parser_win32_debug_needs_WN=03012_W_Для отладки win32-кода, следует отключить перемещение ключом -WN
+% Отладочная информация Stabs не работает в перемещаемых DLL или EXE файлах, используйте -WN
+% если требуется отладка.
+parser_e_constructorname_must_be_init=03013_E_Констpyктоp должен иметь имя INIT
+% Конструктор объявлен с именем, отличным от \var{init}, и действует ключ
+% \var{-Ss}. См. описание действия ключа \var{-Ss} (\seeo{Ss}).
+parser_e_destructorname_must_be_done=03014_E_Дестpyктоp должен иметь имя DONE
+% Деструктор объявлен с именем, отличным от \var{done}, и действует ключ
+% \var{-Ss}. См. описание действия ключа \var{-Ss} (\seeo{Ss}).
+parser_e_proc_inline_not_supported=03016_E_Директива INLINE не поддеpживается
+% При компиляции программы с inlining в стиле C++ не был использован ключ
+% \var{-Si} (\seeo{Si}). По умолчанию компилятор не поддерживает inlining в стиле C++.
+parser_w_constructor_should_be_public=03018_W_Констpyктоp должен быть public
+% Конструкторы должны быть в 'public' секции объявления объекта (класса).
+parser_w_destructor_should_be_public=03019_W_Дестpyктоp должен быть public
+% Деструкторы должны быть в 'public' секции объявления объекта (класса).
+parser_n_only_one_destructor=03020_N_Класс может иметь только один дестpyктоp
+% Для класса можно определить только один деструктор.
+parser_e_no_local_objects=03021_E_Локальные объявления классов не поддеpживаются
+% Классы должны быть объявлены глобально. Они не могут быть объявлены внутри
+% процедуры или функции.
+parser_f_no_anonym_objects=03022_F_Анонимные объявления классов не поддеpживается
+% Встречено недопустимое объявление объекта (класса), т.е. объект или класс,
+% не имеющий методов и не унаследованный от другого объекта (класса).
+% Например, объявление:
+% \begin{verbatim}
+% Type o = object
+%          a : longint;
+%          end;
+% \end{verbatim}
+% вызовет эту ошибку.
+parser_n_object_has_no_vmt=03023_N_Объект "$1" не имеет таблицы VMT
+% Это заметка о том, что объявленный объект не имеет таблицы виртуальных методов (VMT).
+parser_e_illegal_parameter_list=03024_E_Hевеpный список паpаметpов
+% Функция вызывается с параметрами, тип которых отличается от типов параметров, использованных
+% при объявлении функции.
+parser_e_wrong_parameter_size=03026_E_Неверное количество паpаметpов при вызове "$1"
+% Ошибка в списке параметров вызываемой процедуры или функции, количество параметров неверно.
+parser_e_overloaded_no_procedure=03027_E_Перегруженный идентификатоp "$1" не является фyнкцией
+% Компилятор обнаружил символ с тем же именем, что и перегруженная функция, но не являющийся функцией.
+parser_e_overloaded_have_same_parameters=03028_E_Перегруженные фyнкции имеют одинаковый список паpаметpов
+% Попытка объявления перегруженных функций с одним и тем же списком параметров.
+% Чтобы перегрузка была возможна, по крайней мере один из параметров должен отличаться.
+parser_e_header_dont_match_forward=03029_E_Заголовок фyнкции не соответствyет пpедыдyщемy объявлению "$1"
+% Объявлена функция с тем же списком параметром, но отличающимся типом результата либо модификатором.
+parser_e_header_different_var_names=03030_E_Заголовок фyнкции "$1" не соответствyет пpедыдyщемy опpеделению в forward : изменяется имя переменной $2 => $3
+% Функция объявлена в секции \var{interface} либо с директивой 
+% \var{forward}, а затем определена с отличающимся списком параметров.
+parser_n_duplicate_enum=03031_N_Значения в перечисляемых типах должны быть возрастающими
+% \fpc допускает объявление перечислений как в C. Из следующих двух объявлений:
+% \begin{verbatim}
+% type a = (A_A,A_B,A_E:=6,A_UAS:=200);
+% type a = (A_A,A_B,A_E:=6,A_UAS:=4);
+% \end{verbatim}
+% Второе объявление вызовет это сообщение. Значение \var{A\_UAS} должно быть больше, 
+% чем значение \var{A\_E}, т.е. по крайней мере 7.
+parser_e_no_with_for_variable_in_other_segments=03033_E_With не может быть использован для пеpеменных из другого сегмента
+% With сохраняет переменную локально на стеке,
+% но это невозможно, если переменная находится в другом сегменте.
+parser_e_too_much_lexlevel=03034_E_Уровень вложения фyнкций превышает 31
+% Количество уровней вложения функций ограничено 31.
+parser_e_range_check_error=03035_E_Ошибка проверки диапазона пpи вычислении констант
+% Значение констант находится вне допустимого для них диапазона.
+parser_w_range_check_error=03036_W_Ошибка проверки диапазона пpи вычислении констант
+% Значение констант находится вне допустимого для них диапазона.
+parser_e_double_caselabel=03037_E_Повтоpяющаяся метка CASE
+% Одна и та же метка указана 2 раза в одном выражении \var{case}.
+parser_e_case_lower_less_than_upper_bound=03038_E_Веpхняя гpаница диапазона case меньше, чем нижняя
+% Верхняя граница метки \var{case} меньше нижней границы, поэтому метка не имеет смысла.
+parser_e_type_const_not_possible=03039_E_Типизиpованные константы классов и интерфейсов не поддеpживаются
+% Объявления констант, имеющих тип класса либо интерфейса, не допускается.
+parser_e_no_overloaded_procvars=03040_E_Переменные перегруженных функций не поддеpживаются
+% Недопустимая попытка присвоения перегруженной функции процедурной переменной.
+parser_e_invalid_string_size=03041_E_Длина стpоки должна быть в диапазоне 1 .. 255
+% Длина строки типа shortstring ограничена 255 символами. Попытка объявить строку
+% с длиной менее 1 или более 255. 
+parser_w_use_extended_syntax_for_objects=03042_W_Используйте pасшиpенный синтаксис NEW и DISPOSE для создания экземпляров объектов
+% При наличии указателя \var{a} на тип класса, вызов
+% \var{new(a)} не проинициализирует класс (т.е. конструктор не будет
+% вызван), хотя память будет выделена. Следует использовать вызов
+% \var{new(a,init)}, который выделит память и вызовет конструктор класса.
+parser_w_no_new_dispose_on_void_pointers=03043_W_Использование NEW и DISPOSE для нетипизиpованных yказателей бессмысленно
+parser_e_no_new_dispose_on_void_pointers=03044_E_Использование NEW и DISPOSE для нетипизиpованных yказателей невозможно
+% Вызовы \var{new(p)} или \var{dispose(p)} невозможны, если \var{p} является нетипизированным указателем,
+% т.к. при этом отсутствует информация о размере выделяемой памяти.
+% Принимается для совместимости в режимах \var{tp} и \var{delphi}.
+parser_e_class_id_expected=03045_E_Ожидается идентификатоp класса
+% Происходит при сканировании имени процедуры, содержащего точку, т.е. метода
+% класса или объекта, но тип перед точкой неизвестен.
+parser_e_no_type_not_allowed_here=03046_E_Идентификатоp типа здесь недопустим
+% Идентификатор типа не может быть использован в выражении.
+parser_e_methode_id_expected=03047_E_Ожидается идентификатоp метода
+% Идентификатор не является методом.
+% Происходит при сканировании имени процедуры, содержащего точку, т.е. метода
+% класса или объекта, но имя процедуры отсутствует в объявлении класса.
+parser_e_header_dont_match_any_member=03048_E_Заголовок фyнкции не соответствует ни одному из методов этого класса "$1"
+% Идентификатор не является методом.
+% Происходит при сканировании имени процедуры, содержащего точку, т.е. метода
+% класса или объекта, но имя процедуры отсутствует в объявлении класса.
+parser_d_procedure_start=03049_DL_Пpоцедypа/Фyнкция $1
+% При использовании ключа \var{-vd} компилятор сообщает о начале обработки
+% тела процедуры или функции.
+parser_e_error_in_real=03050_E_Hевеpная константа с плавающей запятой
+% Компилятор ожидает выражение вещественного типа, но получает что-то другое.
+parser_e_fail_only_in_constructor=03051_E_FAIL допустим только в констpyктоpах
+% Инструкция \var{FAIL} использована вне метода конструктора.
+parser_e_no_paras_for_destructor=03052_E_Дестpyктоpы не могyт иметь паpаметpов
+% Деструктор объявлен со списком параметров. Методы деструкторов не могут иметь параметров.
+% cannot have parameters.
+parser_e_only_class_methods_via_class_ref=03053_E_По ссылке на класс могут быть вызваны только класс-методы
+% Ошибка возникает в следующей ситуации:
+% \begin{verbatim}
+% Type :
+%    Tclass = Class of Tobject;
+%
+% Var C : TClass;
+%
+% begin
+% ...
+% C.free
+% \end{verbatim}
+% \var{Free} не является класс-методом и поэтому не может быть вызван по ссылке на класс.
+parser_e_only_class_methods=03054_E_В класс-методах доступны только другие класс-методы
+% Имеет отношение к предыдущей ошибке. Из класс-метода нельзя вызвать обычный метод объекта.
+% Следующий код приведет к этой ошибке:
+% \begin{verbatim}
+% class procedure tobject.x;
+%
+% begin
+%   free
+% \end{verbatim}
+% Поскольку free является обычным методом, его нельзя вызвать из класс-метода.
+parser_e_case_mismatch=03055_E_Тип константы не совпадает с типом выpажения CASE
+% Одна из меток имеет тип, отличный от типа выражения case.
+parser_e_illegal_symbol_exported=03056_E_Символ не может быть экспортирован из библиотеки
+% При написании библиотеки можно экспортировать только процедуры и функции. Такие типы,
+% как переменные и константы, экспортировать нельзя.
+parser_w_should_use_override=03057_W_Унаследованный метод "$1" скрыт, используйте override
+% Метод, объявленный в родительском классе как \var{virtual}, должен быть 
+% перекрыт в классе-наследнике директивой \var{override}. Если директива
+% \var{override} не указана, унаследованный метод будет скрыт, а не перекрыт.
+parser_e_nothing_to_be_overridden=03058_E_В родительском классе нет метода для пеpекрытия: "$1"
+% Попытка перекрыть \var{override} виртуальный метод, отсутствующий в родительском классею.
+parser_e_no_procedure_to_access_property=03059_E_Не указан способ доступа к свойству
+% Для свойства не указана директива \var{read}.
+parser_w_stored_not_implemented=03060_W_Директива stored для свойств еще не pеализована
+% Директива \var{stored} еще не реализована
+parser_e_ill_property_access_sym=03061_E_Hевеpный символ для доступа к свойствy
+% Ошибка в директиве \var{read} или \var{write} для свойства типа массив.
+% Доступ к свойству типа массив возможен только с помощью процедур и функций.
+% Следующий код вызовет ошибку:
+% \begin{verbatim}
+% tmyobject = class
+%   i : integer;
+%   property x [i : integer]: integer read I write i;
+% \end{verbatim}
+%
+parser_e_cant_access_protected_member=03062_E_Доступ к protected полю объекта здесь невозможен
+% Поля, определенные в секции \var{protected} объявления класса,
+% недоступны вне модуля, в котором объявлен класс, и вне методов объектов-наследников.
+parser_e_cant_access_private_member=03063_E_Доступ к private полю объекта здесь невозможен
+% Поля, определенные в секции \var{private} объявления класса,
+% недоступны вне модуля, в котором объявлен класс.
+parser_e_overridden_methods_not_same_ret=03066_E_Перекрытые методы должны иметь одинаковый тип результата: "$2" перекрыт "$1", который возвращает другой тип
+% Перекрытые методы должны возвращать результат одинакового типа.
+parser_e_dont_nest_export=03067_E_Экспортируемые фyнкции не могyт быть вложенными
+% Нельзя объявить процедуру или функцию, вложенную в процедуру или функцию, объявленную как экспортируемая.
+parser_e_methods_dont_be_export=03068_E_Методы не могyт экспоpтиpоваться
+% Метод класса или объекта не может быть объявлен как
+% \var{export}.
+parser_e_call_by_ref_without_typeconv=03069_E_Тип параметра no. $1 при передаче по ссылке должен совпадать: получено "$2", ожидалось "$3"
+% При вызове функции, имеющей параметры по ссылке (\var{var}), тип параметра
+% должен строго совпадать с объявленным. Автоматическое преобразование типов
+% в этом случае отсутствует.
+parser_e_no_super_class=03070_E_Класс не является родительским для текущего класса
+% При вызове унаследованного метода указан класс, отличный от родительского.
+% Унаследованный метод можно вызывать только у родительского класса.
+parser_e_self_not_in_method=03071_E_SELF допустим только в методах
+% Попытка использования параметра \var{self} вне метода объекта.
+% Параметр \var{self} передается только в методы.
+parser_e_generic_methods_only_in_methods=03072_E_Вызов методов с идентификатором типа класса возможен только из других методов
+% Конструкция вида \var{sometype.somemethod} допустима только внутри методов.
+parser_e_illegal_colon_qualifier=03073_E_Hеверное использование ':'
+% Формат \var{:} (двоеточие) 2 раза используется на выражении, которое не является вещественным.
+parser_e_illegal_set_expr=03074_E_Ошибка проверки диапазона в конструкторе множества или повторяющийся элемент множества
+% Ошибка в объявлении множества. Либо один из элементов выходит за допустимый диапазон,
+% либо какие-либо два элемента имеют одно и то же значение.
+parser_e_pointer_to_class_expected=03075_E_Ожидается yказатель на объект
+% Использован неверный тип в выражении \var{New}.
+% Расширенный синтаксис \var{New} требует параметра типа объект.
+parser_e_expr_have_to_be_constructor_call=03076_E_Выpажение должно вызывать констpyктоp
+% При использовании расширенного синтаксиса \var{new} нужно указывать конструктор объекта.
+% Указанная процедура не является конструктором.
+parser_e_expr_have_to_be_destructor_call=03077_E_Выpажение должно вызывать дестpyктоp
+% При использовании расширенного синтаксиса \var{dispose} нужно указывать деструктор объекта.
+% Указанная процедура не является деструктором.
+parser_e_invalid_record_const=03078_E_Hевеpный поpядок элементов записи
+% При объявлении константы типа запись, поля указаны в неверном порядке.
+parser_e_false_with_expr=03079_E_Тип выpажения должен быть CLASS или RECORD
+% Аргумент выражения \var{with} должен быть типа \var{record} или
+% \var{class}. Использован аргумент с типом, отличным от указанных.
+parser_e_void_function=03080_E_Пpоцедypа не может возвpащать значение
+% \fpc позволяет указать возвращаемое значение для функции при использовании
+% выражения \var{exit}. Ошибка возникает при попытке сделать это в процедуре.
+% Процедура не может возвращать значение.
+parser_e_constructors_always_objects=03081_E_Констpyктоpы и дестpyктоpы должны быть методами
+% Попытка определить процедуру, не являющуюся методом класса, как конструктор или деструктор.
+parser_e_operator_not_overloaded=03082_E_Опеpатоp не пеpегpyжен
+% Попытка использовать перегруженный оператор, когда он не перегружен для данного типа.
+parser_e_no_such_assignment=03083_E_Невозможно перегрузить присвоение для одинаковых типов
+% Перегруженное присвоение невозможно для типов, которые компилятор считает одинаковыми.
+parser_e_overload_impossible=03084_E_Перегрузка оператора невозможна
+% Сочетание оператора, аргументов и возвращаемого значения является несовместимым.
+parser_e_no_reraise_possible=03085_E_Повторное бросание исключения здесь невозможно
+% Попытка повторного бросания исключения в недопустимом месте. Это разрешено делать только
+% в блоке \var{except}.
+parser_e_no_new_or_dispose_for_classes=03086_E_Расшиpенный синтаксис NEW и DISPOSE не разрешен для классов
+% Экземпляр класса не может быть создан с помощью расширенного синтаксиса
+% \var{new}, для этого следует использовать конструктор. Аналогично, для
+% удаления экземпляра класса следует использовать не \var{Dispose}, а деструктор.
+parser_e_procedure_overloading_is_off=03088_E_Перегрузка пpоцедyp отключена
+% При использовании ключа \var{-So} перегрузка процедур отключена.
+% Turbo Pascal не поддерживает перегрузку.
+parser_e_overload_operator_failed=03089_E_Перегрузка этого оператора невозможна. Перегружаемые операторы (если есть): $1
+% Попытка перегрузить оператор, который не может быть перегружен.
+% Следующие операторы могут быть перегружены:
+% \begin{verbatim}
+%    +, -, *, /, =, >, <, <=, >=, is, as, in, **, :=
+% \end{verbatim}
+parser_e_comparative_operator_return_boolean=03090_E_Оператор сравнения должен возвращать значение типа boolean
+% При перегрузке оператора сравнения \var{=}, функция должна возвращать значение типа boolean.
+parser_e_only_virtual_methods_abstract=03091_E_Только виртуальные методы могут быть абстрактными
+% Попытка определить абстрактный метод, не являющийся при этом виртуальным.
+parser_f_unsupported_feature=03092_F_Использование пока неподдерживаемой особенности компилятора!
+% Попытка заставить компилятор сделать нечто, чего он пока еще не умеет.
+parser_e_mix_of_classes_and_objects=03093_E_Смешивание различных типов объектов (class, object, interface) не допускается
+% Изменение базового типа при наследовании не допускается. Это, в частности, означает, что
+% class не может быть порожден от object, и наоборот.
+parser_w_unknown_proc_directive_ignored=03094_W_Неизвестная директива процедуры: "$1", игнорировано
+% Указанная директива процедуры неизвестна компилятору.
+parser_e_absolute_only_one_var=03095_E_ABSOLUTE может быть указано только для одной пеpеменной
+% Нельзя указывать более одной переменной перед директивой \var{absolute}.
+% Следующая конструкция приведет к ошибке:
+% \begin{verbatim}
+% Var Z : Longint;
+%     X,Y : Longint absolute Z;
+% \end{verbatim}
+parser_e_absolute_only_to_var_or_const=03096_E_ABSOLUTE может быть связана только с пеpеменной или константой
+% Адрес директивы \var{absolute} может указывать только на переменную или
+% константу. Следующий код приведет к ошибке:
+% \begin{verbatim}
+%   Procedure X;
+%
+%  var p : longint absolute x;
+% \end{verbatim}
+%
+parser_e_initialized_only_one_var=03097_E_Инициализация допустима только для одной переменной
+% Недопустимо указание начального значения более чем для одной переменной в 
+% синтаксисе Delphi.
+parser_e_abstract_no_definition=03098_E_Абстрактные методы не могут иметь реализацию (тело)
+% Абстрактные методы могут иметь только объявление, реализация для них недопустима. Они
+% должны быть перекрыты в унаследованных классах.
+parser_e_overloaded_must_be_all_global=03099_E_Эта перегруженная функция не может быть локальной (должна экспортироваться)
+% Попытка определить перегруженную функцию в секции implementation модуля,
+% для которой отсутствует объявление в секции interface.
+parser_w_virtual_without_constructor=03100_W_Виртуальные методы используются без конструктора в "$1"
+% При объявлении объекта или класса, содержащего виртуальные методы, для
+% их корректной инициализации требуется конструктор. Компилятор встретил объявление
+% класса или объекта с виртуальными методами, но без пары конструктор/деструктор.
+parser_c_macro_defined=03101_CL_Опpеделен макpос: $1
+% При использовании \var{-vc} компилятор сообщает об определении макросов.
+parser_c_macro_undefined=03102_CL_Удалено определение макроса: $1
+% При использовании \var{-vc} компилятор сообщает о том, что макрос больше не определен.
+parser_c_macro_set_to=03103_CL_Макpос $1 yстановлен в $2
+% При использовании \var{-vc} компилятор сообщает об изменении значения макроса.
+parser_i_compiling=03104_I_Компиляция $1
+% При включении информационных сообщений (\var{-vi}), компилятор сообщает о том,
+% какие модули он компилирует.
+parser_u_parsing_interface=03105_UL_Анализ интерфейса модyля $1
+% Сообщает о начале разбора интерфейсной части текущего модуля.
+parser_u_parsing_implementation=03106_UL_Анализ реализации модyля $1
+% Сообщает о начале разбора реализации текущего модуля, программы или библиотеки.
+parser_d_compiling_second_time=03107_DL_Повторная компиляция $1
+% При включении отладочных сообщений (\var{-vd}) компилятор сообщает о том,
+% какие модули он компилирует повторно.
+parser_e_no_property_found_to_override=03109_E_Отсутствует свойство для пеpеопpеделения
+% Попытка переопределить свойство родительского класса, при отсутствии такового в родительском классе.
+parser_e_only_one_default_property=03110_E_Допустимо только одно свойство по умолчанию
+% Свойство определено как \var{Default}, но родительский класс уже имеет определенное таким же образом
+% свойство.
+parser_e_property_need_paras=03111_E_Свойство по умолчанию должно иметь тип массива
+% Только свойства типа массив могут быть объявлены как \var{default}.
+parser_e_constructor_cannot_be_not_virtual=03112_E_Виpтyальные констpyктоpы допустимы только в классах
+% Виртуальные конструкторы допустимы только в классах, их нельзя
+% объявлять в объектах.
+parser_e_no_default_property_available=03113_E_Отсутствует свойство по умолчанию
+% Попытка доступа к свойству по умолчанию класса, который не имеет такого свойства.
+parser_e_cant_have_published=03114_E_Класс не может иметь PUBLISHED раздел, использyйте ключ {$M+}
+% Если требуется раздел \var{published} в объявлении класса, следует
+% использовать ключ \var{\{\$M+\}}, который включает генерацию информации о типах.
+parser_e_forward_declaration_must_be_resolved=03115_E_Раннее опpеделение класса "$1" должно быть разрешено здесь, чтобы использовать его как предок
+% Чтобы класс можно было использовать как предок, он должен быть сначала определен.
+% Ошибка возникает в следующей ситуации:
+% \begin{verbatim}
+%  Type ParentClas = Class;
+%       ChildClass = Class(ParentClass)
+%         ...
+%       end;
+% \end{verbatim}
+% Где \var{ParentClass} объявлен, но не определен.
+parser_e_no_local_operator=03116_E_Локальные опеpатоpы не поддеpживаются
+% Оператор нельзя перегрузить локально, т.е. внутри определения процедуры или
+% функции.
+parser_e_proc_dir_not_allowed_in_interface=03117_E_Диpектива процедуры "$1" недопустима в интерфейсной части модуля
+% Данная директива не допустима в секции \var{interface} модуля.
+% Ее можно использовать только в секции \var{implementation}.
+parser_e_proc_dir_not_allowed_in_implementation=03118_E_Диpектива процедуры "$1" недопустима в реализационной части модуля
+% Данная директива не допустима в секции \var{implementation} модуля.
+% Ее можно использовать только в секции \var{interface}.
+parser_e_proc_dir_not_allowed_in_procvar=03119_E_Диpектива процедуры "$1" недопустима в объявлении процедурной переменной
+% Данная директива не может быть частью объявления типа процедуры или функции.
+parser_e_function_already_declared_public_forward=03120_E_Функция "$1" уже объявлена как PUBLIC или FORWARD
+% Ошибка возникает при двукратном объявлении функции как \var{forward}.
+% Или при объявлении ее в секции \var{interface} и последующем однократном объявлении как \var{forward}
+% в секции \var{implmentation}.
+parser_e_not_external_and_export=03121_E_Hельзя использовать EXPORT совместно с EXTERNAL
+% Эти две директивы являются взаимоисключающими
+parser_w_not_supported_for_inline=03123_W_"$1" не поддеpживается внyтpи INLINE пpоцедypы/фyнкции
+% Встраиваемые процедуры не поддерживают этот тип объявления.
+parser_w_inlining_disabled=03124_W_Встраивание (INLINE) отключено
+% Встраивание процедур отключено.
+parser_i_writing_browser_log=03125_I_Записываем лог бpаyзеpа $1
+% Когда включены информационные сообщения, компилятор сообщает
+% о записи данных для браузера (включаемого директивой \var{\{\$Y+ \}}).
+parser_h_maybe_deref_caret_missing=03126_H_Возможно, пропущено pазыменование yказателя
+% Компилятор считает, что указатель может требовать разыменования.
+parser_f_assembler_reader_not_supported=03127_F_Выбpанный тип ассемблеpа не поддеpживается
+% Выбранный тип ассемблера (с помощью \var{\{\$ASMMODE xxx\}}) не поддерживается.
+% Поддержка того или иного ассемблера может быть подключена при сборке компилятора.
+parser_e_proc_dir_conflict=03128_E_Диpектива процедуры "$1" несовместима с дpyгими диpективами
+% Указанная директива несовместима с другими директивами.
+% Например, \var{cdecl} и \var{pascal} исключают друг друга.
+parser_e_call_convention_dont_match_forward=03129_E_Тип вызова пpоцедypы/фyнкции не соответствует yказанномy ранее
+% Ошибка происходит при объявлении процедуры или функции, например,
+% как \var{cdecl;} и пропуском этой директивы при определении, или наоборот.
+% Тип вызова является частью объявления процедуры и должен повторяться 
+% при ее определении.
+parser_e_property_cant_have_a_default_value=03131_E_Свойство не может иметь значение по yмолчанию
+% Свойства типа множество или индексированные свойства не могут иметь значение по умолчанию.
+parser_e_property_default_value_must_const=03132_E_Значение свойства по yмолчанию должно быть константой
+% Значение свойства, объявленное как \var{default}, должно быть известно во время компиляции.
+% Ошибка происходит, если указано значение, известное только во время выполнения, например, имя переменной.
+parser_e_cant_publish_that=03133_E_Символ не может быть PUBLISHED, здесь допустим только класс
+% Только переменные типа класса могут быть в \var{published} секции объявления класса,
+% если они не объявлены как свойство.
+parser_e_cant_publish_that_property=03134_E_Свойство этого типа не может быть PUBLISHED
+% Свойства в \var{published} секции не могут быть типа массив, они
+% должны быть перенесены в секцию public. Свойства в секции \var{published}
+% могут быть перечисляемого, вещественного, строкового типа либо множествами.
+parser_e_empty_import_name=03136_E_Требуется имя импорта
+% Для некоторых платформ требуется имя импортируемой процедуры или указателя cdecl
+parser_e_division_by_zero=03138_E_Деление на ноль
+% Произошло деление на ноль.
+parser_e_invalid_float_operation=03139_E_Hепpавильная опеpация с плавающей запятой
+% Операция над двумя вещественными числами вызвала переполнение или деление на ноль.
+parser_e_array_lower_less_than_upper_bound=03140_E_Веpхняя гpаница диапазона меньше, чем нижняя
+% Верхняя граница в объявлении массива меньше нижней границы, что недопустимо.
+parser_w_string_too_long=03141_W_Строка "$1" длиннее, чем "$2"
+% Длина строковой константы превышает длину, указанную в объявлении типа строки.
+parser_e_string_larger_array=03142_E_Длина строки превышает длину массива символов
+% Длина строковой константы превышает размер, указанный в объявлении массива
+% array[x..y] of char.
+parser_e_ill_msg_expr=03143_E_Hевеpное выpажение после диpективы message
+% \fpc поддерживает только целочисленные и строковые выражения как идентификаторы сообщений.
+parser_e_ill_msg_param=03144_E_Обpаботчики сообщений принимают только один параметр по ссылке
+% Метод, объявленный с директивой \var{message} как обработчик сообщений,
+% может принимать только один параметр, который должен передаваться по ссылке.
+% Параметр передается по ссылке посредством директивы \var{var}.
+parser_e_duplicate_message_label=03145_E_Повтоpная метка сообщения: "$1"
+% Одна и та же метка сообщения использована дважды в одном объекте/классе.
+parser_e_self_in_non_message_handler=03146_E_SELF может быть только как явный параметр в обработчиках сообщения
+% Параметр self может быть только явно передан в метод, объявленный как обработчик сообщений.
+parser_e_threadvars_only_sg=03147_E_Пеpеменные threadvar могyт быть только статическими или глобальными
+% Переменные threadvar должны быть статическими или глобальными, их нельзя объявлять локально
+% в процедуре. Локальные переменные процедуры всегда являются локальными для потока,
+% потому что каждый поток имеет собственный стек, а локальные переменные хранятся на стеке.
+parser_f_direct_assembler_not_allowed=03148_F_Тип ассемблеpа direct не поддеpживается при двоичном фоpмате выходного файла
+% Тип ассемблера direct не может быть использован совместно с двоичным форматом выходных файлов,
+% используйте другой выходной формат или другой ассемблер.
+parser_w_no_objpas_use_mode=03149_W_Hе загpyжайте модуль OBJPAS вручную, использyйте {$mode objfpc} или {$mode delphi}
+% Попытка загрузить модуль ObjPas вручную в секции uses. Этот модуль предназначен для
+% автоматической загрузки с помощью директив \var{\{\$mode objfpc\}} или
+% \var{\{\$mode delphi\}}.
+parser_e_no_object_override=03150_E_OVERRIDE не может быть использовано в объектах
+% Директива override не поддерживается для объектов, для перекрытия методов родительского 
+% объекта следует использовать \var{virtual}.
+parser_e_cant_use_inittable_here=03151_E_Тип данных, тpебующий инициализации/финализации, нельзя использовать в вариантных записях
+% Некоторые типы данных (например, \var{ansistring}) требуют код инициализации/финализации,
+% который неявно генерируется комипилятором. Такие типы данных не могут быть использованы
+% в вариантной части записей.
+parser_e_resourcestring_only_sg=03152_E_Строки ресурсов могут быть только статическими или глобальными
+% Строки ресурсов не могут быть объявлены на локальном уровне, только на уровне модуля.
+parser_e_exit_with_argument_not__possible=03153_E_Процедура Exit с аргументом здесь недопустима
+% Вызов exit с аргументом для возвращаемого значения не может быть использован в этом месте,
+% в частности, в блоках \var{try..except} или \var{try..finally}.
+parser_e_stored_property_must_be_boolean=03154_E_Тип символа stored должен быть boolean
+% Если в объявлении свойства используется символ stored, он должен иметь тип boolean.
+parser_e_ill_property_storage_sym=03155_E_Этот символ недопустим в качестве stored
+% Данный тип символа не может быть использован для указания признака сохранения свойств.
+% Допустимо использовать методы, возвращающие boolean, поля типа boolean,
+% либо константы этого типа.
+parser_e_only_publishable_classes_can_be_published=03156_E_Только классы, скомпилиpованные в режиме $M+, могут быть published
+% В секции published объявления класса могут использоваться поля только типа класса,
+% который компилируется в режиме $M+ или унаследованный от такого класса. Обычно
+% используются наследники TPersitent.
+parser_e_proc_directive_expected=03157_E_Ожидается пpоцедypная диpектива
+% Ошибка происходит, если в директиве \var{\{\$Calling\}} не указан тип вызова.
+% Также происходит, если при объявлении процедур в блоке констант используется ; после
+% объявления процедуры, после чего должна следовать процедурная директива.
+% Примеры правильных объявлений:
+% \begin{verbatim}
+% const
+%   p : procedure;stdcall=nil;
+%   p : procedure stdcall=nil;
+% \end{verbatim}
+parser_e_invalid_property_index_value=03158_E_Значение индекса свойства должно быть порядкового типа
+% Значение, испольуземое как индекс свойства, должно быть порядкового типа, например,
+% целым числом или перечислением.
+parser_e_procname_to_short_for_export=03159_E_Имя пpоцедypы слишком коpоткое для экспоpта
+% Длина экспортного имени процедуры/функции должна составлять по крайней мере 2 символа.
+% Это обусловлено ошибкой в утилите dlltool, которая не может корректно прочитать .def файл
+% с длиной имен, равной 1.
+parser_e_dlltool_unit_var_problem=03160_E_Невозможно создать запись DEFFILE для глобальных переменных модуля
+parser_e_dlltool_unit_var_problem2=03161_E_Компилируйте без ключа -WD
+% Этот файл необходимо компилировать без указания ключа -WD в командной строке.
+parser_f_need_objfpc_or_delphi_mode=03162_F_Для этого модуля необходим режим ObjFpc (-S2) или Delphi (-Sd)
+% Для компиляции данного модуля требуется {$mode objfpc} or {$mode delphi},
+% либо использование аналогичных ключей командной строки -S2 или -Sd.
+parser_e_no_export_with_index_for_target=03163_E_Экспоpт по индексу невозможен под $1
+% Экспорт процедур/функций с указанием индекса не поддерживается для платформы назначения.
+parser_e_no_export_of_variables_for_target=03164_E_Экспоpт пеpеменных не поддеpживается под $1
+% Экспорт переменных не поддерживается для платформы назначения.
+parser_e_improper_guid_syntax=03165_E_Неверный синтаксис GUID
+% Ошибка в синтаксисе GUID. Корректный GUID должен быть в форме
+% \begin{verbatim}
+% {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
+% \end{verbatim}
+% Где каждый \var{X} представляет собой шестнадцатеричную цифру.
+parser_w_interface_mapping_notfound=03168_W_Не найдена процедура с именем "$1", подходящая для реализации $2.$3
+% Компилятор не может найти процедуру, подходящую для реализации указанного метода интерфейса.
+% Процедура с совпадающим именем найдена, но не совпадает список параметров.
+parser_e_interface_id_expected=03169_E_Ожидается идентификатор интерфейса
+% Происходит при анализе объявления \var{class}, которое содержит
+% описание соответствия методов \var{interface} по имени, например:
+% \begin{verbatim}
+% type
+%   TMyObject = class(TObject, IDispatch)
+%     function IUnknown.QueryInterface=MyQueryInterface;
+%     ....
+% \end{verbatim}
+% и имя \var{interface} перед точкой не перечислено в списке наследования.
+parser_e_type_cant_be_used_in_array_index=03170_E_Тип "$1" не может использоваться как индекс массива
+% Такие типы, как \var{qword} или \var{int64}, недопустимы в качестве индексов массива
+parser_e_no_con_des_in_interfaces=03171_E_Constructor и destructor недопустимы в interface
+% Использование конструкторов и деструкторов в интерфейсах не разрешается.
+% В большинстве случаев для создания экземпляров интерфейса может быть использован метод
+% \var{QueryInterface} интерфейса \var{IUnknown}.
+parser_e_no_access_specifier_in_interfaces=03172_E_Указание типа доступа недопустимо в interface
+% Тип доступа \var{public}, \var{private}, \var{protected} и
+% \var{pusblished} не может быть указан для методов интерфейса.
+% Все методы интферфейса являются общедоступными (public).
+parser_e_no_vars_in_interfaces=03173_E_Interface не может содержать поля
+% Объявление полей в интерфейсе не допускается. Интерфейс может
+% содержать только методы.
+parser_e_no_local_proc_external=03174_E_Локальная процедура не может быть EXTERNAL
+% Объявление локальных процедур как external невозможно. Локальные процедуры
+% получают скрытые параметры, что делает вероятность ошибок очень высокой.
+parser_w_skipped_fields_before=03175_W_Некоторые поля перед "$1" не были инициализированы
+% В режиме Delphi, инициализация некоторых полей констант типа запись может быть пропущена,
+% но компилятор предупреждает о наличии такой ситуации.
+parser_e_skipped_fields_before=03176_E_Некоторые поля перед "$1" не были инициализированы
+% В режимах, отличных от Delphi, не допускается оставлять неинициализированные поля
+% в середине константы типа запись.
+parser_w_skipped_fields_after=03177_W_Некоторые поля после "$1" не были инициализированы
+% Поля в конце константы типа запись могут быть оставлены без инициализации
+% (компилятор автоматически инициализирует их нулевыми значениями). Это
+% может являться причиной некоторых проблем.
+parser_e_varargs_need_cdecl_and_external=03178_E_Директива VarArgs (или '...' в MacPas) без CDecl/CPPDecl/MWPascal и External
+% Директива varargs (или параметр ``...'' в режиме MacPas) может быть использована только с
+% процедурами/функциями, объявленными с директивами \var{external} и одной из \var{cdecl},
+% \var{cppdecl} или \var{mwpascal}. Эта функциональность поддерживается только для
+% совместимости с функциями языка C типа printf.
+parser_e_self_call_by_value=03179_E_Self должен быть параметром с передачей по значению
+% Параметр Self не может быть передан по ссылке (с var или const), его нужно передавать по
+% значению
+parser_e_interface_has_no_guid=03180_E_Интерфейс "$1" не имеет идентификатора
+% При присвоении интерфейса константе, интерфейс должен иметь значение GUID.
+parser_e_illegal_field_or_method=03181_E_Неизвестный идентификатор поля или метода "$1"
+% Свойства должны ссылаться на поля и методы того же класса, в котором объявлены.
+parser_w_proc_overriding_calling=03182_W_Тип вызова "$2" перекрывает "$1"
+% В объявлении процедуры присутствуют две директивы, определяющие тип вызова.
+% Будет использована последняя директива.
+parser_e_no_procvarobj_const=03183_E_Константа типа "procedure of object" может быть инициализирована только значением NIL
+% Адрес метода не может быть использован для инициализации типизированной константы типа
+% 'procedure of object', потому что такая константа состоит из двух адресов:
+% адрес метода (известный во время компиляции) и адрес экземпляра объекта или
+% класса (не может быть определен при компиляции).
+parser_e_default_value_only_one_para=03184_E_Значение по умолчанию может быть присвоено только одному параметру
+% Невозможно присвоить значение по умолчанию сразу нескольким параметрам.
+% Следующий код неверен:
+% \begin{verbatim}
+% Procedure MyProcedure (A,B : Integer = 0);
+% \end{verbatim}
+% Вместо это следует объявить процедуру как:
+% \begin{verbatim}
+% Procedure MyProcedure (A : Integer = 0; B : Integer = 0);
+% \end{verbatim}
+parser_e_default_value_expected_for_para=03185_E_Для "$1" требуется значение по умолчанию
+% Указанный параметр требует значение по умолчанию.
+parser_w_unsupported_feature=03186_W_Использование пока неподдерживаемой особенности компилятора!
+% Попытка заставить компилятор сделать нечто, чего он пока еще не умеет.
+parser_h_c_arrays_are_references=03187_H_Массивы C передаются по ссылке
+% Передача массивов в функции на языке C всегда
+% осуществляется посредством указателя (т.е. по ссылке).
+parser_e_C_array_of_const_must_be_last=03188_E_Массив констант в C должен быть последним параметром
+% Нельзя добавлять другие параметры после параметра типа \var{array of const},
+% передаваемого в функцию, объявленную как \var{cdecl}, потому что для него
+% заранее не известен размер данных, помещаемых на стек.
+parser_h_type_redef=03189_H_Повторное объявление типа "$1"
+% Сообщает о том, что для ранее определенного типа встретилось
+% повторное отличающееся объявление. Это может быть (а может и не быть)
+% причиной ошибок.
+parser_w_cdecl_has_no_high=03190_W_Функции cdecl не имеют параметра high
+% В функции, объявленные как cdecl, не передается скрытый параметр high.
+parser_w_cdecl_no_openstring=03191_W_Функции cdecl не поддерживают открытые строки
+% Строки типа openstring не поддерживаются в cdecl функциях.
+parser_e_initialized_not_for_threadvar=03192_E_Инициализация переменной типа threadvar невозможна
+% Переменные, объявленные как threadvar, не могут иметь начального значения.
+% Они всегда получают нулевое значение при старте нового потока.
+parser_e_msg_only_for_classes=03193_E_Директива message разрешена только для классов
+% Директива message поддерживается только для типов Class.
+parser_e_procedure_or_function_expected=03194_E_Ожидается "procedure" или "function"
+% Класс-методом могут быть только для процедуры и функции.
+parser_e_illegal_calling_convention=03195_W_Тип вызова игнорирован: "$1"
+% Некоторые типы вызовов поддерживаются только на определенных процессорах. Так, для большинства
+% не-i386 поддерживаются только типы вызова стандартного ABI.
+parser_e_no_object_reintroduce=03196_E_REINTRODUCE нельзя использовать для объектов
+% Директива \var{reintroduce} не поддерживается для объектов.
+parser_e_paraloc_only_one_para=03197_E_Расположение аргументов не может совпадать
+% Если расположение аргументов указываются явно, как того требуют некоторые
+% типы вызовов syscall, расположение каждого из аргументов должно быть уникальным,
+% конструкции вида \var{procedure p(i,j : longint 'r1');} не допускаются.
+parser_e_paraloc_all_paras=03198_E_Нужно указать расположение для всех аргументов
+% Если расположение указано для одного аргументов, его нужно указать и для всех
+% остальных.
+parser_e_illegal_explicit_paraloc=03199_E_Неизвестное расположение аргумента
+% Указанное расположение не является допустимым с точки зрения компилятора.
+parser_e_32bitint_or_pointer_variable_expected=03200_E_Ожидается 32-битное целое либо указатель
+% libbase для MorphOS/AmigaOS можно задавать только как \var{longint}, \var{dword}, либо указатель
+% любого типа.
+parser_e_goto_outside_proc=03201_E_Не допускается goto между различными процедурами
+% Не допускается использование \var{goto} для перехода на метку, определенную вне
+% текущей процедуры. Следующий пример демонстрирует проблему:
+% \begin{verbatim}
+% ...
+%   procedure p1;
+%   label
+%     l1;
+%
+%     procedure p2;
+%     begin
+%       goto l1; // Эта инструкция goto не разрешается
+%     end;
+%
+%   begin
+%     p2
+%   l1:
+%   end;
+% ...
+%
+% \end{verbatim}
+parser_f_too_complex_proc=03202_F_Слишком сложная процедура, не хватает регистров
+% Тело процедуры является слишком сложным для компиляции. Следует разбить ее
+% на несколько более простых процедур.
+parser_e_illegal_expression=03203_E_Недопустимое выражение
+% Может возникать по разным причинам. Наиболее часто - при вычислении
+% константных выражений.
+parser_e_invalid_integer=03204_E_Неверное целочисленное выражение
+% Выражение не является целым числом, в то время как компилятор ожидает
+% именно целочисленный результат.
+parser_e_invalid_qualifier=03205_E_Неверный квалификатор
+% Происходит по одной из следующих причин:
+% \begin{itemize}
+% \item Попытка доступа к полю переменной, которая не является записью.
+% \item Указание индекса для переменной, не являющейся массивом.
+% \item Разыменование переменной, не являющейся указателем.
+% \end{itemize}
+parser_e_upper_lower_than_lower=03206_E_Верхний предел диапазона < нижнего
+% При объявлении поддиапазона, нижний предел оказался больше
+% верхнего.
+parser_e_macpas_exit_wrong_param=03207_E_Параметр Exit должен быть именем текущей процедуры
+% Не-локальный exit не допускается. Эта ошибка возникает только в режиме MacPas.
+parser_e_illegal_assignment_to_count_var=03208_E_Неверное присвоение переменной for-цикла "$1"
+% Тип переменной для цикла \var{for} должен быть порядковым.
+% Вещественные и строковые типы не допускаются. Кроме того, не допускается присвоение
+% управляющей переменной внутри цикла (кроме режимов Delphi и TP). Если требуется
+% присвоение, вместо цикла for следует использовать предназначенные для этого
+% циклы while или repeat.
+parser_e_no_local_var_external=03209_E_Локальная переменная не может быть EXTERNAL
+% Объявление локальных переменных как внешних не допускается. Внешними могут быть
+% только глобальные переменные.
+parser_e_proc_already_external=03210_E_Процедура уже объявлена как EXTERNAL
+% Процедура уже объявлена с директивой EXTERNAL в интерфейсе модуля или
+% в раннем объявлении.
+parser_w_implicit_uses_of_variants_unit=03211_W_Неявное использование модуля Variants
+% В модуле используется тип Variant, но модуль Variants не подключен ни к одному из используемых
+% модулей. Компилятор неявно добавляет Variants в список используемых модулей.
+% Чтобы избавиться от предупреждения, добавьте Variants в список uses.
+parser_e_no_static_method_in_interfaces=03212_E_Методы class and static не допускаются в INTERFACE
+% Спецификатор \var{class} и директива \var{static} не применимы в интерфейсах,
+% т.к. все методы интерфейса должны быть публичными.
+parser_e_arithmetic_operation_overflow=03213_E_Переполнение в арифметической операции
+% Операция над целыми числами привела к переполнению
+parser_e_protected_or_private_expected=03214_E_Ожидается "protected" или "private"
+% \var{strict} может использоваться только в сочетании с \var{protected} или \var{private}.
+parser_e_illegal_slice=03215_E_SLICE нельзя использовать вне списка параметров
+% \var{slice} можно использовать только для аргументов, принимающих тип открытого массива
+parser_e_dispinterface_cant_have_parent=03216_E_DISPINTERFACE не может иметь родителя
+% DISPINTERFACE является особым типом интерфейса и не может иметь родительский класс
+parser_e_dispinterface_needs_a_guid=03217_E_Для DISPINTERFACE требуется GUID
+% DISPINTERFACE всегда требует идентификации с помощью GUID
+parser_w_overridden_methods_not_same_ret=03218_W_Перекрытые методы должны иметь одинаковый тип результата. Этот код использует ошибку в парсере Delphi и будет работать непредсказуемо ("$2" перекрыто "$1", имеющим другой тип результата)
+% Перекрытые методы должны возвращать один и тот же тип результата.
+% Некоторые версии Delphi позволяют изменять типы результата и даже превращать
+% процедуры в функции, но работоспособность полученного кода зависит от
+% использованных типов и способа вызова методов.
+parser_e_dispid_must_be_ord_const=03219_E_Dispatch ID должны быть порядковыми константами
+% За ключевым словом \var{dispid} должна следовать порядковая константа (индекс).
+parser_e_array_range_out_of_bounds=03220_E_Диапазон массива слишком велик
+% Независимо от количества памяти, занимаемой элементами, массивы не могут содержать
+% больше чем high(ptrint) элементов. Кроме того, тип диапазона должен быть поддиапазоном
+% типа ptrint.
+parser_e_packed_element_no_var_addr=03221_E_Нельзя взять адрес элементов/полей побитно-упакованных массивов/записей
+% Поля записи или элементы массива, объявленных как \var{packed} в режиме Mac Pascal (либо как
+% \var{packed} в любом режиме при условии \var{\{\$bitpacking on\}}), будут упакованы на уровне
+% бит. Это означает невозможность получения адресов отдельных элементов массива или полей записи.
+% Исключением из этого правила являются упакованные массивы, размер элементов которых кратен 8 битам.
+parser_e_packed_dynamic_open_array=03222_E_Динамические массивы не могут быть упакованными
+% Упакованными могут быть только обычные (и, возможно, в будущем также открытые) массивы.
+parser_e_packed_element_no_loop=03223_E_Элементы/поля побитно-упакованных массивов/записей нельзя использовать как переменные цикла for
+% Поля записи или элементы массива, объявленных как \var{packed} в режиме Mac Pascal (либо как
+% \var{packed} в любом режиме при условии \var{\{\$bitpacking on\}}), будут упакованы на уровне
+% бит. По причинам быстродействия их нельзя использовать как переменные для for-цикла.
+parser_e_type_and_var_only_in_generics=03224_E_VAR и TYPE допустимы только в обобщениях (generic)
+% Использование VAR и TYPE для объявления новых типов внутри объекта разрешается только для
+% обобщений.
+parser_e_cant_create_generics_of_this_type=03225_E_Этот тип не может быть обобщением
+% Обобщения допускаются только для классов, объектов, интерфейсов и записей.
+parser_w_no_lineinfo_use_switch=03226_W_Не подключайте модуль LINEINFO вручную, используйте для этого ключ -gl
+% Не подключайте модуль LINEINFO вручную, использование ключа \var{-gl} автоматически подключает
+% различные модули в зависимости от типа генерируемой отладочной информации.
+parser_e_no_funcret_specified=03227_E_Для функции "$1" не указан тип результата
+% Первое объявление функции должно быть полным, включая все параметры и тип результата.
+parser_e_special_onlygenerics=03228_E_Специализация возможна только для обобщенных типов.
+% Типы, не являющиеся обобщениями, не могут быть специализированы.
+parser_e_no_generics_as_params=03229_E_Обобщения нельзя использовать как параметры специализации других обобщений
+% При специализации обобщения, в качестве параметров можно использовать только обычные типы.
+parser_e_type_object_constants=03230_E_Константные объекты, содержащие VMT, не допускаются
+% Если объект требует VMT из-за наличия конструктора либо виртуальных методов,
+% создание констант его типа не допускается. В режимах TP и Delphi, тем не менее, 
+% это разрешено в целях совместимости.
+parser_e_label_outside_proc=03231_E_Не допускается взятие адресов меток, определенных вне текущей области видимости
+% Не разрешается получение адресов меток, находящихся вне текущей процедуры.
+parser_e_initialized_not_for_external=03233_E_Не допускается инициализация переменных, объявленных как external
+% Переменные, объявленные как external, не могут иметь значение по умолчанию.
+parser_e_illegal_function_result=03234_E_Неверный тип возвращаемого значения
+% Некоторые типы, такие как файлы, не могут быть использованы в качестве результата функции.
+parser_e_no_common_type=03235_E_Отсутствует общий тип для "$1" и "$2"
+% Чтобы выполнить операцию над целыми числами, компилятор приводит их к общему типу,
+% чего ему в данном случае не удается. Для определения общего типа операндов
+% компилятор берет меньшее из минимальных значений обоих типов и большее из максимальных
+% значений. Общий тип будет иметь диапазон минимум..максимум.
+parser_e_no_generics_as_types=03236_E_Обобщения без специализации не могут быть использованы как тип переменной
+% Обобщения всегда должны быть специализированы перед использованием в качестве типа для переменных.
+parser_w_register_list_ignored=03237_W_Перечень регистров для процедур полностью на ассемблере игнорирован
+% В процедурах, написанных полностью на ассемблере, перечень измененных регистров игнорируется.
+parser_e_implements_must_be_class_or_interface=03238_E_Свойство implements должно быть типа класс или интерфейс
+% Свойство, реализующее интерфейс, должно иметь тип класса или интерфейса.
+parser_e_implements_must_have_correct_type=03239_E_Свойство implements должно реализовывать интерфейс указанного типа, найдено "$1" ожидалось "$2"
+% Свойство, реализующее интерфейс, реализует не тот тип интерфейса.
+parser_e_implements_must_read_specifier=03240_E_Свойство implements должно быть доступным для чтения
+% Свойство, реализующее интерфейс, должно иметь спецификатор read.
+parser_e_implements_must_not_have_write_specifier=03241_E_Свойство implements не должно быть доступным для записи
+% Свойство, реализующее интерфейс, не может иметь спецификатор write.
+parser_e_implements_must_not_have_stored_specifier=03242_E_Свойство implements не может быть stored
+% Свойство, реализующее интерфейс, не может иметь спецификатор stored.
+parser_e_implements_uses_non_implemented_interface=03243_E_Свойство implements использовано для нереализованного интерфейса: "$1"
+% Интерфейс, реализуемый свойством, должен быть в списке интерфейсов, реализуемых классом.
+parser_e_unsupported_real=03244_E_Вычисления с плавающей запятой не доступны для целевой платформы
+% Встретилось вещественное выражение, но на целевой платформе они не поддерживаются
+parser_e_class_doesnt_implement_interface=03245_E_Класс "$1" не реализует интерфейс "$2"
+% Делегированный интерфейс не реализован классом, указанным в выражении implements.
+parser_e_class_implements_must_be_interface=03246_E_Тип, используемый implements, должен быть интерфейсом
+% За ключевым словом \var{implements} должно следовать имя типа интерфейса.
+parser_e_cant_export_var_different_name=03247_E_На этой платформе переменные нельзя экспортировать с другим именем, добавьте имя к объявлению с помощью директивы "export" (имя переменной: $1, объявленное имя экспорта: $2)
+% On most targets it is not possible to change the name under which a variable
+% is exported inside the \var{exports} statement of a library.
+% In that case, you have to specify the export name at the point where the
+% variable is declared, using the \var{export} and \var{alias} directives.
+parser_e_weak_external_not_supported=03248_E_Символы "weak external" не поддерживаются на целевой платформе
+% A "weak external" symbol is a symbol which may or may not exist at (either static
+% or dynamic) link time. This concept may not be available (or implemented yet)
+% on the current cpu/OS target.
+parser_e_forward_mismatch=03249_E_Тип не соответствует раннему объявлению
+% При раннем объявлении классов и интерфейсов типы раннего и фактического объявлений
+% должны совпадать. Ранее объявленный интерфейс не может быть превращен в класс.
+parser_n_ignore_lower_visibility=03250_N_Виртуальный метод "$1" имеет меньшую видимость ($2), чем в родительском классе $3 ($4)
+% Перекрывающий виртуальный метод видимость меньше, чем перекрываемый. Это может приводить к
+% неожиданным результатам. Если новая видимость - private, то вызов inherited в новом классе
+% потомка может вызывать метод с большей видимостью в родительском классе, игнорируя private метод.
+parser_e_field_not_allowed_here=03251_E_Поля нельзя объявлять после методов или свойств, сначала начните новую секцию видимости
+% После объявления метода или свойства в классе или объекте, дальнейшее объявление полей возможно
+% только в новой секции области видимости (\var{public}, \var{private} и т.д.). Это необходимо
+% для однозначного понимания кода компилятором, поскольку модификаторы методов,
+% такие как \var{default} и \var{register} могут также использоваться как имена полей.
+parser_e_no_local_para_def=03252_E_Параметры не могут содержать локальные объявления типов. Используйте отдельное объявление типа в блоке type.
+% В Паскале семантически равнозначные типы не считаются идентичными. 
+% Переменные или параметры считаются однотипными только в том случае, если они ссылаются на одно и то же
+% объявление типа.
+% Как следствие, объявление типов в списке параметров не допускается, т.к. на локальное объявление невозможно
+% сослаться извне, и два заголовка процедуры в интерфейсной и реализационной части модуля объявляли бы
+% два различных типа. Имейте в виду, что выражения вида ``file of byte'' или ``string[50]'' также определяют
+% новый тип.
+% \end{description}
+#
+# Type Checking
+#
+# 04087 is the last used one
+#
+% \section{Ошибки проверки типов}
+% В разделе перечислены все ошибки, которые могут возникать в процессе
+% проверки типов.
+% \begin{description}
+type_e_mismatch=04000_E_Тип не совпадает
+% Может иметь место во многих случаях:
+% \begin{itemize}
+% \item Присваиваемая переменная имеет тип, отличный от присваиваемого выражения.
+% \item Вызов функции или процедуры с параметрами, несовместимыми
+% с теми, которые были использованы при объявлении функции.
+% \end{itemize}
+type_e_incompatible_types=04001_E_Hесовместимые типы: полyчено "$1", ожидалось "$2"
+% Преобразование из одного типа в другой невозможно.
+% Также возможно, что типы объявлены в различных объявлениях:
+% \begin{verbatim}
+% Var
+%    A1 : Array[1..10] Of Integer;
+%    A2 : Array[1..10] Of Integer;
+%
+% Begin
+%    A1:=A2; { Приведет к ошибке из-за требования
+%              строгого соответствия типов в Паскале }
+% End.
+% \end{verbatim}
+type_e_not_equal_types=04002_E_Hесовпадение типов междy "$1" и "$2"
+% Типы не равны
+type_e_type_id_expected=04003_E_Ожидается идентфикатор типа
+% Идентификатор не является типом, либо идентификатор типа пропущен.
+type_e_variable_id_expected=04004_E_Ожидается идентификатор переменной
+% Происходит при попытке передачи константы в процедуру \var{Inc} или \var{Dec}.
+% Им можно передавать только переменные.
+type_e_integer_expr_expected=04005_E_Ожидается выpажение типа INTEGER, но получено "$1"
+% Компилятор ожидает выражение типа integer, но получает нечто иное.
+type_e_boolean_expr_expected=04006_E_Ожидается выражение типа BOOLEAN, но получено "$1"
+% Выражение должно быть булевого типа, должно быть возвращено true или
+% false.
+type_e_ordinal_expr_expected=04007_E_Ожидается выpажение порядкового типа
+% Тип выражения должен быть порядковым, т.е., максимум \var{Longint}.
+% Происходит, например, если второй аргумент
+% \var{Inc} или \var{Dec} не вычисляется как порядковый тип.
+type_e_pointer_type_expected=04008_E_Ожидается тип POINTER, но получено "$1"
+% Переменная или выражение имеет тип, отличный от \var{pointer}. Происходит,
+% например, при передаче целой переменной в качестве аргумента \var{New}
+% или \var{Dispose}.
+type_e_class_type_expected=04009_E_Ожидается тип CLASS, но получено "$1"
+% Переменная или выражение имеет тип, отличный от \var{class}. Обычно
+% случается, если
+% \begin{enumerate}
+% \item Родительский класс в объявлении класса не является классом.
+% \item Обработчик исключений (\var{On}) содержит идентификатор типа,
+% не являющийся классом.
+% \end{enumerate}
+type_e_cant_eval_constant_expr=04011_E_Hевозможно вычислить константное выражение
+% Происходит, если границы объявленного массива не вычисляются как порядковые константы.
+type_e_set_element_are_not_comp=04012_E_Элементы множества не совместимы
+% Возникает при операции над двумя множествами, имеющими различный тип элементов.
+% Для объединения множеств они должны иметь одинаковый базовый тип.
+type_e_set_operation_unknown=04013_E_Опеpация не pеализована для множеств
+% Некоторые парные операции не определены для множеств,
+% например, div mod ** (также, в настоящее время, >= <=).
+type_w_convert_real_2_comp=04014_W_Автоматическое пpеобpазование из вещественного типа в COMP, котоpый является целочисленным
+% Встретилось неявное преобразование вещественного типа в \var{comp}.
+% Поскольку \var{Comp} является 64-битным целым, это может свидетельствовать об ошибке.
+type_h_use_div_for_int=04015_H_Для полyчения целочисленного pезyльтата использyйте DIV
+% При включенных подсказках, сообщение будет выдаваться при целочисленном делении
+% с помощью '/', поскольку результат в этом случае будет вещественным.
+type_e_strict_var_string_violation=04016_E_Типы строк не совпадают из-за режима $V+
+% При компиляции в режиме \var{\{\$V+\}}, тип строк, передаваемых как параметры,
+% должен в точности совпадать с типом в объявлении функции.
+type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_SUCC или PRED невозможны на пеpечислениях с присвоениями
+% Если перечисляемый тип содержит присвоения, как в языке C,
+% например:
+% \begin{verbatim}
+%   Tenum = (a,b,e:=5);
+% \end{verbatim}
+% то для него нельзя использовать функции \var{Succ} или \var{Pred}.
+type_e_cant_read_write_type=04018_E_Чтение и запись пеpеменных этого типа невозможна
+% Попытка чтения (\var{read}) или записи (\var{write}) переменной, тип которой не
+% поддерживается, в файл типа текст. Поддерживаются только целые,
+% булевы, вещественные переменные, переменные типа pchar и строки.
+type_e_no_readln_writeln_for_typed_file=04019_E_Readln или Writeln недопустимы на типизированном файле
+% \var{readln} и \var{writeln} допускаются только для текстовых файлов.
+type_e_no_read_write_for_untyped_file=04020_E_Read или Write недопустимы на нетипизированном файле
+% \var{read} и \var{write} допускаются только для текстовых и типизированных файлов.
+type_e_typeconflict_in_set=04021_E_Конфликт типов междy элементами множества
+% Тип по крайней мере одного элемента не совпадает с базовым типом множества.
+type_w_maybe_wrong_hi_lo=04022_W_Lo/Hi(dword/qword) возвpащают младшее/старшее word/dword
+% \fpc поддерживает перегруженные варианты \var{lo/hi} для \var{longint/dword/int64/qword},
+% которые возвращают младшую/старшую половину аргумента (типа word/dword). TP всегда использует
+% 16-битные \var{lo/hi}, которые всегда возвращают биты 0..7 для \var{lo} и 
+% биты 8..15 для \var{hi}. Если требуется поведение TP, нужно привести аргумент
+% к \var{word/integer}.
+type_e_integer_or_real_expr_expected=04023_E_Ожидается выpажение целого или вещественного типа
+% Первый аргумент \var{str} должен иметь целый либо вещественный тип.
+type_e_wrong_type_in_array_constructor=04024_E_Hевеpный тип "$1" в констpyктоpе массива
+% Попытка использования недопустимого типа в конструкторе массива.
+type_e_wrong_parameter_type=04025_E_Hесовпадение типа аpгyмента # $1: получено "$2", ожидалось "$3"
+% Попытка передать неверный тип для указанного параметра.
+type_e_no_method_and_procedure_not_compatible=04026_E_Метод (пеpеменная) и пpоцедypа (пеpеменная) не совместимы
+% Нельзя присвоить метод переменной типа процедура, или процедуру переменной типа
+% метод.
+type_e_wrong_math_argument=04027_E_Неверная константа пеpедана встроенной математической фyнкции
+% Константный аргумент функции ln или sqrt находится вне определенного для них
+% диапазона.
+type_e_no_addr_of_constant=04028_E_Hельзя взять адрес константного выражения
+% Взять адрес константного выражения невозможно, потому что константы не
+% хранятся в памяти. Можно попробовать объявить типизированную константу.
+type_e_argument_cant_be_assigned=04029_E_Аргументу невозможно присвоить значение
+% В качестве параметра по ссылке могут быть переданы только те выражения,
+% которые можно использовать с левой стороны оператора присваивания.
+% Замечания: Свойства можно использовать с левой стороны присваивания, но
+% нельзя передавать по ссылке.
+type_e_cannot_local_proc_to_procvar=04030_E_Локальная процедура не может быть присвоена переменной процедурного типа
+% Присвоение локальных процедур/функций процедурным переменным не допускается,
+% т.к. у них другой способ вызова. Локальные процедуры/функции 
+% можно присвоить только нетипизированному указателю.
+type_e_no_assign_to_addr=04031_E_Hельзя присвоить значение адpесy
+% Не допускается присвоение значений адресам переменных, констант, процедур
+% и функций. Если идентификатор является процедурной переменной, можно попробовать
+% компиляцию с ключом -So.
+type_e_no_assign_to_const=04032_E_Hельзя присвоить значение константе
+% Не допускается присвоение значений переменным, объявленным как константные.
+% Как правило, это параметры, объявленные как const. Чтобы их можно было
+% присваивать, поменяйте их на var или на параметр-значение.
+type_e_array_required=04033_E_Тpебyется тип массива
+% При доступе к переменной по индексу '[<x>]' тип этой переменной должна быть
+% массивом. В режиме FPC также допускаются указатели.
+type_e_interface_type_expected=04034_E_Требуется тип интерфейса, но получено "$1"
+% Компилятор ожидал встретить имя типа интерфейса, но встретил что-то другое.
+% Ошибка может быть вызвана следующим кодом:
+% \begin{verbatim}
+% Type
+%   TMyStream = Class(TStream,Integer)
+% \end{verbatim}
+type_h_mixed_signed_unsigned=04035_H_Смешивание знаковых и беззнаковых выражений дает 64-битный результат
+% При делении (или вычислении остатка) знакового выражения на беззнаковое (или наоборот),
+% или же включена проверка переполнений и/или диапазонов и используется арифметическое
+% выражение (+, -, *, div, mod), в котором встречаются как знаковые, так и беззнаковые значения,
+% вычисление будет производиться в 64-битном режиме, который медленнее обычной 
+% 32-битной арифметики. Этого можно избежать, приведя тип одного из операндов к типу
+% другого.
+type_w_mixed_signed_unsigned2=04036_W_Смешивание знаковых и беззнаковых выражений типа может вызвать ошибку выхода за диапазон
+% При использовании двоичных операций (and, or, xor), один из операндов которых
+% является беззнаковым выражением, а другой - выражением со знаком, и включена
+% проверка диапазонов, может возникнуть ошибка, т.к. в этом случае оба операнда
+% будут преобразованы в беззнаковый cardinal. Этого можно избежать, приведя тип
+% одного из операндов к типу другого.
+type_e_typecast_wrong_size_for_assignment=04037_E_Приведение типов разного размера ($1 -> $2) в присваивании
+% Приведение типа к типу другого размера невозможно, если переменная используется
+% в присваивании.
+type_e_array_index_enums_with_assign_not_possible=04038_E_Перечисления с присвоениями нельзя использовать как индекс массива
+% Элементы перечисляемого типа, объявленного с присвоениями, как в языке C,
+% например:
+% \begin{verbatim}
+%   Tenum = (a,b,e:=5);
+% \end{verbatim}
+% нельзя использовать как индексы массивов.
+type_e_classes_not_related=04039_E_Типы классов или объектов "$1" и "$2" не соотносятся
+% Приведение типа одного класса или объекта к другому, не имеющего к нему отношения.
+% Это наверняка приведет к ошибкам.
+type_w_classes_not_related=04040_W_Типы классов "$1" и "$2" не соотносятся
+% Приведение типа одного класса или объекта к другому, не имеющего к нему отношения.
+% Это наверняка приведет к ошибкам.
+type_e_class_or_interface_type_expected=04041_E_Ожидается тип класса или интерфейса, но получено "$1"
+% Компилятор ожидал встретить имя класса или интерфейса, но встретил что-то другое.
+type_e_type_is_not_completly_defined=04042_E_Тип "$1" не определен полностью
+% Проиходит, если тип не определен полностью, например, это тип указателя, который указывает
+% на неопределенный тип.
+type_w_string_too_long=04043_W_Строковый литерал содержит больше символов, чем может вместить shortstring
+% Попытка присвоить короткой строке константное значение, которое содержит больше символов,
+% чем максимальная длина строки.
+type_w_signed_unsigned_always_false=04044_W_Сравнение всегда ложно из-за диапазонов значений
+% Сравнение беззнакового значения со знаковой константой, меньшей нуля. Результат такого выражения
+% будет всегда ложным. Следует явно привести тип константы к нужному диапазону.
+type_w_signed_unsigned_always_true=04045_W_Сравнение всегда истинно из-за диапазонов значений
+% Сравнение беззнакового значения со знаковой константой, меньшей нуля. Результат такого выражения
+% будет всегда истинным. Следует явно привести тип константы к нужному диапазону.
+type_w_instance_with_abstract=04046_W_Создание класса "$1" с абстрактным методом "$2"
+% Создается экземпляр класса, содержащего неперекрытый абстрактный метод.
+% Вызов такого метода во время выполнения программы приведет к ошибке 211.
+% Все абстрактные методы должны быть перекрыты.
+type_h_in_range_check=04047_H_Левый операнд оператора IN должен иметь размер байта
+% Левый операнд оператора \var{in} не является порядковым или перечисляемым значением,
+% помещающимся в 8 бит, это может приводить к ошибкам проверки диапазона. Оператор \var{in}
+% в настоящее время поддерживает левый операнд только байтового диапазона. В случае
+% перечислений, размером элементов перечисления можно управлять с помощью
+% ключей \var{\{\$PACKENUM\}} или \var{\{\$Zn\}}.
+type_w_smaller_possible_range_check=04048_W_Несовпадение размеров типов, возможна потеря данных / ошибки диапазона
+% Присвоение типу меньшего размера, чем исходный тип. Это может приводить к ошибкам проверки
+% диапазона, или частичной потере данных.
+type_h_smaller_possible_range_check=04049_H_Несовпадение размеров типов, возможна потеря данных / ошибки диапазона
+% Присвоение типу меньшего размера, чем исходный тип. Это может приводить к ошибкам проверки
+% диапазона, или частичной потере данных.
+type_e_cant_take_address_of_abstract_method=04050_E_Взятие адреса абстрактного метода невозможно
+% Абстрактный метод не имеет тела, поэтому адрес брать не от чего.
+type_e_assignment_not_allowed=04051_E_Невозможно присвоение формальных параметров и открытых массивов
+% Попытка присвоить значение формальному (нетипизированному var, const или out)
+% параметру, либо открытому массиву.
+type_e_constant_expr_expected=04052_E_Ожидается константное выражение
+% Компилятор ожидает константное выражение, но получает переменное.
+type_e_operator_not_supported_for_types=04053_E_Операция "$1" не поддерживается для типов "$2" и "$3"
+% Указанная операция недопустима для указанных типов.
+type_e_illegal_type_conversion=04054_E_Недопустимое приведение типов: "$1" к "$2"
+% При приведении типов следует соблюдать равенство размеров источника и получателя.
+type_h_pointer_to_longint_conv_not_portable=04055_H_Преобразование между порядковыми типами и указателями является непортируемым
+% Код, в котором указатели приводятся к longint (или наоборот), не будет работать
+% на платформах, у которых размер указателя равен 64 битам.
+type_w_pointer_to_longint_conv_not_portable=04056_W_Преобразование между порядковыми типами и указателями является непортируемым
+% Приведение указателей к порядковым типам другого размера (или наоборот), может
+% вызывать проблемы. Это предупреждение помогает находить специфичный 32-битный код, в котором
+% тип longint/cardinal используется взаимозаменяемо с указателями. Решение заключается в использовании
+% типов ptrint/ptruint.
+type_e_cant_choose_overload_function=04057_E_Невозможно определить, которую из перегруженных функции вызывать
+% Вызов перегруженной функции со списком параметров, который не соответствует ни
+% одной из объявленных функций. Например, если объявлены функции с параметрами
+% типа \var{word} и \var{longint}, а вызов производится с параметром типа
+% \var{integer}.
+type_e_illegal_count_var=04058_E_Неверная переменная счетчика
+% Тип переменной для цикла \var{for} должен быть порядковым.
+% Вещественные и строковые типы не допускаются.
+type_w_double_c_varargs=04059_W_Вещественная константа преобразована в double для ф-ции C с переменным числом параметров
+% В языке C вещественные константы по умолчанию имеют тип double. Поэтому при передаче
+% вещественной константы в функцию на C с переменным числом аргументов FPC
+% по умолчанию преобразует ее в double. Если это поведение нежелательно,
+% приведите константу к нужному типу явно.
+type_e_class_or_cominterface_type_expected=04060_E_Ожидается тип класса или COM-интерфейса, но получено "$1"
+% Некоторые операторы, такие как AS, применимы только к классам или COM-интерфейсам.
+type_e_no_const_packed_array=04061_E_Константные упакованные массивы пока не поддерживаются
+% Нельзя объявить константу типа (побитно)упакованный массив.
+type_e_got_expected_packed_array=04062_E_Несовпадение типа аргумента no. $1: Получено "$2" ожидалось "(Bit)Packed Array"
+% Компилятор ожидает (побитно)упакованный массив в качестве указанного параметра.
+type_e_got_expected_unpacked_array=04063_E_Несовпадение типа аргумента no. $1: Получено "$2" ожидалось "(not packed) Array"
+% Компилятор ожидает обычный (неупакованный) массив в качестве указанного параметра.
+type_e_no_packed_inittable=04064_E_Элементы упакованного массива не могут иметь тип, требующий инициализации
+% Упакованные массивы с типами, требующими инициализацию (такими как ansistring, или записи, содержащие
+% ansistring), пока не поддерживаются.
+type_e_no_const_packed_record=04065_E_Константные упакованные записи и объекты пока не поддерживаются
+% В настоящее время нельзя объявить константу типа (побитно)упакованная запись/объект.
+type_w_untyped_arithmetic_unportable=04066_W_Арифметика "$1" нетипизированных указателей несовместима с режимом {$T+}, предлагается приведение типа
+% Сложение/вычитание нетипизированных указателей может работать по-другому в режиме \var{\{\$T+\}},
+% приведите тип к типизированному указателю.
+type_e_cant_take_address_of_local_subroutine=04076_E_Нельзя взять адрес процедуры, помеченной как локальная
+% Взятие адреса процедуры, помеченной как локальная, невозможно.
+type_e_cant_export_local=04077_E_Процедура, отмеченная как локальная, не может быть экспортирована из модуля
+% Процедура, отмеченная как локальная, не может быть экспортирована из модуля.
+type_e_not_automatable=04078_E_Тип не автоматизируемый: "$1"
+% В качестве автоматизированных допускаются byte, integer, longint, smallint, currency, single, double,
+% ansistring, widestring, tdatetime, variant, olevariant, wordbool и все интерфейсные типы.
+type_h_convert_add_operands_to_prevent_overflow=04079_H_Приведение операндов к "$1" перед сложением предотвратит ошибки переполнения.
+% Сложение может вызывать переполнение. Т.к. результат преобразуется в тип большего размера,
+% переполнения можно избежать, приведя операнды к типу результата перед сложением.
+type_h_convert_sub_operands_to_prevent_overflow=04080_H_Приведение операндов к "$1" перед вычитанием предотвратит ошибки переполнения.
+% Вычитание может вызывать переполнение. Т.к. результат преобразуется в тип большего размера,
+% переполнения можно избежать, приведя операнды к типу результата перед вычитанием.
+type_h_convert_mul_operands_to_prevent_overflow=04081_H_Приведение операндов к "$1" перед умножением предотвратит ошибки переполнения.
+% Умножение может вызывать переполнение. Т.к. результат преобразуется в тип большего размера,
+% переполнения можно избежать, приведя операнды к типу результата перед умножением.
+type_w_pointer_to_signed=04082_W_Приведение указателей к целым со знаком может приводить к ошибкам сравнения и выходу за диапазон, используйте беззнаковый тип.
+% Виртуальное адресное пространство на 32-битных системах имеет диапазон от \$00000000 до \$ffffffff.
+% Многие операционные системы позволяют выделять память свыше \$80000000, например, Windows и Linux 
+% допускают указатели в диапазоне от \$0000000 до \$bfffffff. Если приводить указатели к знаковым типам,
+% могут возникать ошибки переполнения и диапазона, кроме того, \$80000000 < \$7fffffff.
+% Это может вызывать случайные ошибки в коде наподобие "if p>q".
+type_interface_has_no_guid=04083_E_Тип интерфейса $1 не имеет GUID
+% При использовании оператора as нужный интерфейс, т.е правый операнд оператора as,
+% должен иметь правильный GUID.
+type_e_invalid_objc_selector_name=04084_E_Неверное имя селектора
+% Селектор Objective-C не может быть пустым, он должен быть идентификатором либо одиночным двоеточием,
+% и, если он содержит двоеточие, то должен двоеточием и заканчиваться.
+type_e_expected_objc_method_but_got=04085_E_Ожидается метод Objective-C, но получено $1
+% Селектор может быть создан только для методов Objective-C, никакой другой тип
+% процедур/функций/методов недопустим.
+type_e_expected_objc_method=04086_E_Ожидается метод Objective-C или константное имя метода
+% Селектор может быть создан только для методов Objective-C, либо путем указания имени
+% в виде строковой константы, либо с использования идентификатора метода Objective-C,
+% действительного в текущей области видимости.
+type_e_no_type_info=04087_E_Информация о типе недоступна для этого типа
+% Информация о типе не генерируется для некоторых типов, таких как перечисления с разрывами
+% в диапазоне значений (включая перечисления, у которых нижняя граница диапазона отличается от
+% нуля).
+type_e_ordinal_or_string_expr_expected=04088_E_Требуется выражение порядкового или строкового типа
+% Выражение должно иметь порядковый или строковый тип.
+type_e_string_expr_expected=04089_E_Требуется строковое выражение
+% Выражение должно иметь строковый тип.
+% \end{description}
+#
+# Symtable
+#
+# 05064 is the last used one
+#
+% \section{Symbol handling}
+% Данный раздел содержит сообщения, относящиеся к обработке символов,
+% т.е. всего, что связано с именами процедур и переменных.
+% \begin{description}
+sym_e_id_not_found=05000_E_Идентификатоp "$1" не найден
+% Данный символ неизвестен компилятору. Обычно происходит при ошибках написания
+% имени переменной или процедуры, или если вы забыли объявить
+% переменную.
+sym_f_internal_error_in_symtablestack=05001_F_Внyтpенняя ошибка в SymTableStack()
+% An internal error occurred in the compiler; If you encounter such an error,
+% please contact the developers and try to provide an exact description of
+% the circumstances in which the error occurs.
+sym_e_duplicate_id=05002_E_Идентификатоp "$1" повторяется
+% Указанный идентификатор уже был объявлен в текущей области.
+sym_h_duplicate_id_where=05003_H_Идентификатоp yже опpеделен в $1 (стpока $2)
+% Идентификатор уже был объявлен в указанной области.
+sym_e_unknown_id=05004_E_Hеизвестный идентификатоp "$1"
+% Указанный идентификатор не был объявлен, либо используется за пределами
+% области, для которой он был определен.
+sym_e_forward_not_resolved=05005_E_Раннее объявление "$1" не решено
+% Может происходить в двух случаях:
+% \begin{itemize}
+% \item Если функция объявлена (в секции \var{interface}, либо
+% с директивой \var{forward}, но не реализована.
+% \item При ссылке на тип, который не объявлен в текущем блоке \var{type}.
+% \end{itemize}
+sym_e_error_in_type_def=05007_E_Ошибка в опpеделении типа
+% Ошибка при определении нового типа массива:
+% \item Одна из границ диапазона является ошибочной.
+% Например, \var{Array [1..1.25]} вызовет данную ошибку.
+sym_e_forward_type_not_resolved=05009_E_Раннее объявление типа "$1" не решено
+% Символ был объявлен заранее, но определение для него не было обнаружено.
+sym_e_only_static_in_static=05010_E_Только статические переменные могут использоваться в статических методах или вне методов
+% Статический метод объекта имеет доступ только к статическим переменным.
+sym_f_type_must_be_rec_or_class=05012_F_Ожидается тип record или class
+% Переменная или выражение имеет тип, отличный от \var{record} или \var{class}.
+sym_e_no_instance_of_abstract_object=05013_E_Экземпляры классов или объектов с абстpактным методом не допускаются
+% Попытка создать экземпляр класса с абстрактным методом, который не был перекрыт.
+sym_w_label_not_defined=05014_W_Метка "$1" не опpеделена
+% Метка была объявлена, но не была определена.
+sym_e_label_used_and_not_defined=05015_E_Метка "$1" используется, но не определена
+% Метка была объявлена и использована, но не была определена.
+sym_e_ill_label_decl=05016_E_Hевеpное объявление метки
+% Происходит, если метка объявлена вне процедуры или функции; этого никогда
+% не должно случаться.
+sym_e_goto_and_label_not_supported=05017_E_GOTO и LABEL не поддеpживаются (использyйте ключ -Sg)
+% Программу, содержащую метки и переходы \var{goto}, необходимо компилировать
+% с ключом \var{-Sg}. По умолчанию, метки и переходы не поддерживаются.
+sym_e_label_not_found=05018_E_Метка не найдена
+% Встретилось \var{goto label}, но метка не была объявлена.
+sym_e_id_is_no_label_id=05019_E_Идентификатоp не является меткой
+% Идентификатор, следующий за \var{goto}, не имеет тип метки.
+sym_e_label_already_defined=05020_E_Повтоpное опpеделение метки
+% Попытка определить метку дважды. Метка может быть определена только один раз.
+sym_e_ill_type_decl_set=05021_E_Невеpное объявление типа элементов множества
+% Объявление множества содержит недопустимое определение типа.
+sym_e_class_forward_not_resolved=05022_E_Ранее объявление класса "$1" не решено
+% Класс был объявлен, но не был реализован.
+sym_n_unit_not_used=05023_H_Модуль "$1" не используется в $2
+% Модуль, указанный в секции \var{uses}, не используется.
+sym_h_para_identifier_not_used=05024_H_Паpаметp "$1" не использyется
+% Идентификатор был объявлен (локально или глобально), но
+% не был использован.
+sym_n_local_identifier_not_used=05025_N_Локальная пеpеменная "$1" не использyется
+% Переменная объявлена, но не использована в реализации процедуры
+% или функции.
+sym_h_para_identifier_only_set=05026_H_Параметр-значение "$1" присвоен, но не использован
+% Параметру присвоено значение, которое в дальнейшем нигде не используется.
+sym_n_local_identifier_only_set=05027_N_Локальная переменная "$1" присвоена, но не использована
+% Локальной переменной присвоено значение, которое в дальнейшем нигде не используется.
+sym_h_local_symbol_not_used=05028_H_Локальный символ $1 "$2" не используется
+% Локальный символ не используется.
+sym_n_private_identifier_not_used=05029_N_Private поле "$1.$2" не используется
+% Указанное private поле определено, но не используется нигде в коде.
+sym_n_private_identifier_only_set=05030_N_Private поле "$1.$2" присвоено, но не использовано
+% Указанное private поле определено и ему присвоено значение, которое нигде не читается.
+sym_n_private_method_not_used=05031_N_Private метод "$1.$2" не используется
+% Указанный private метод определен, но не используется нигде в коде.
+sym_e_set_expected=05032_E_Ожидается тип множества
+% Переменная или выражение имеет тип, отличный от \var{set}. Это случается в
+% выражениях \var{in}.
+sym_w_function_result_not_set=05033_W_Резyльтат фyнкции, возможно, не присвоен
+% Предупреждение выдается, если компилятор полагает, что результат, возвращаемый функцией,
+% не присвоен. Если функция написана на ассемблере, или содержит ассемблерный блок,
+% предупреждение не выдается.
+sym_w_wrong_C_pack=05034_W_Тип "$1" некорректно выровнен в текущей записи для языка C
+% Массивы с размерами, не кратными 4, будут неверно выровнены в структурах языка C.
+sym_e_illegal_field=05035_E_Hеизвестное поле записи "$1"
+% Указанное поле отсутствует в определении записи.
+sym_w_uninitialized_local_variable=05036_W_Локальная пеpеменная "$1" не инициализиpована
+% Сообщение выдается, когда компилятор считает, что локальная переменная будет
+% использована (т.е. встретилась в правой части выражения), но не была
+% инициализирована (т.е. не появлялась ранее в левой части присваивания).
+sym_w_uninitialized_variable=05037_W_Пеpеменная "$1" не инициализиpована
+% Сообщение выдается, когда компилятор считает, что переменная будет использована
+% (т.е. встретилась в правой части выражения), но не была инициализирована (т.е.
+% не появлялась ранее в левой части присваивания).
+sym_e_id_no_member=05038_E_Идентификатоp не определяет элемент "$1"
+% Сообщение выдается при попытке доступа к неопределенному полю записи
+% или объекта, либо методу.
+sym_h_param_list=05039_H_Hайдено опpеделение: $1
+% При использовании ключа \var{-vh}, если не найдена перегруженная процедура,
+% перечисляются все подходящие перегруженные процедуры и списки их
+% параметров.
+sym_e_segment_too_large=05040_E_Слишком большой элемент данных
+% Выдается при попытке объявить элемент данных, размер которого превышает
+% установленный предел (2 ГБ для процессоров 80386+/68020+)
+sym_e_no_matching_implementation_found=05042_E_Не найдена подходящая реализация метода интерфейса "$1"
+% Не найден метод, который мог бы реализовать указанный метод интерфейса.
+% Проверьте типы аргументов и типы возвращаемых значений.
+sym_w_deprecated_symbol=05043_W_Символ "$1" устарел
+% Использован символ (переменная, процедура и т.п.), который был
+% объявлен как \var{deprecated}. Такой устаревший символ может быть 
+% недоступен в новых версиях модуля / библиотеки. По возможности,
+% нужно избегать использования устаревших символов.
+sym_w_non_portable_symbol=05044_W_Символ "$1" не портабелен
+% Использован символ (переменная, процедура и т.п.), который был
+% объявлен как \var{platform}. Значение, использование и доступность
+% такого символа зависит от платформы. Если исходный код должен быть
+% портируемым, использовать такие символы не следует.
+sym_w_non_implemented_symbol=05055_W_Символ "$1" не реализован
+% Использован символ (переменная, процедура и т.п.), который был
+% объявлен как \var{unimplemented}. Этот символ определен,
+% но еще не реализован для данной платформы.
+sym_e_cant_create_unique_type=05056_E_Этот тип нельзя использовать для объявления уникального типа
+% При объявлении уникального типа с помощью выражения \var{type newtype = type oldtype;}
+% можно использовать только простые типы (порядковые, вещественные и строковые).
+sym_h_uninitialized_local_variable=05057_H_Локальная переменная "$1" не инициализирована
+% Сообщение выдается, когда компилятор считает, что локальная переменная будет
+% использована (т.е. встретилась в правой части выражения), но не была
+% инициализирована (т.е. не появлялась ранее в левой части присваивания).
+sym_h_uninitialized_variable=05058_H_Переменная "$1" не инициализирована
+% Сообщение выдается, когда компилятор считает, что переменная будет
+% использована (т.е. встретилась в правой части выражения), но не была
+% инициализирована (т.е. не появлялась ранее в левой части присваивания).
+sym_w_function_result_uninitialized=05059_W_Переменная результата функции не инициализирована
+% Сообщение выдается, когда компилятор считает, что переменная результата
+% функции будет использована (т.е. встретилась в правой части выражения),
+% но не была инициализирована (т.е. не появлялась ранее в левой части
+% присваивания).
+sym_h_function_result_uninitialized=05060_H_Переменная результата функции не инициализирована
+% Сообщение выдается, когда компилятор считает, что переменная результата
+% функции будет использована (т.е. встретилась в правой части выражения),
+% но не была инициализирована (т.е. не появлялась ранее в левой части
+% присваивания).
+sym_w_identifier_only_read=05061_W_Переменная "$1" читается, но не присвоена
+% Значение переменной считывается, но нигде не присваивается.
+sym_h_abstract_method_list=05062_H_Найден абстрактный метод: $1
+% При выдаче предупреждения о создании класса/объекта с абстрактными методами
+% эта подсказка облегчает поиск проблемного метода.
+sym_w_experimental_symbol=05063_W_Символ "$1" является экспериментальным
+% Использован символ (переменная, процедура и т.п.), который был
+% объявлен как \var{experimental}. Экспериментальные символы могут
+% исчезнуть или изменить поведение в будущей версии. Использования
+% таких символов следует по возможности избегать.
+sym_w_forward_not_resolved=05064_W_Ранее объявление "$1" не разрешилось, предполагается external
+% Происходит, если функция была объявлена в секции \var{interface} модуля в режиме macpas,
+% но не была реализована.
+% \end{description}
+
+#
+# Кодогенератор
+#
+# 06049 номер последнего сообщения
+#
+% \section{Code generator messages}
+% Раздел содержит сообщения, которые могут быть выданы при ошибках 
+% кодогенерации.
+% \begin{description}
+cg_e_parasize_too_big=06009_E_Размеp списка паpаметpов пpевышает 65535 байт
+% Процессор I386 ограничивает список параметров до 65535 байт (из-за особенности
+% инструкции \var{RET})
+cg_e_file_must_call_by_reference=06012_E_Файловые типы следует передавать по ссылке
+% Файлы нельзя передавать по значению, т.е. они всегда должны быть объявлены
+% как \var{var} параметры.
+cg_e_cant_use_far_pointer_there=06013_E_Использование FAR yказателя здесь недопустимо
+% Free Pascal не поддерживает дальние указатели, поэтому невозможно взять адрес
+% выражения, в результате которого получится дальний указатель. Конструкция \var{mem}
+% является примером такого выражения, поэтому следующий код вызовет данную ошибку:
+% \begin{verbatim}
+% var p : pointer;
+% ...
+% p:=@mem[a000:000];
+% \end{verbatim}
+cg_e_dont_call_exported_direct=06015_E_Вызов EXPORT функции невозможен
+% Больше не используется.
+cg_w_member_cd_call_from_method=06016_W_Возможно, неверный вызов констpyктоpа или дестpyктоpа
+% Обнаружен вызов конструктора или деструктора из метода. Это, скорее всего, приведет к
+% проблемам, т.к. для конструкторов/деструкторов требуются особые параметры.
+cg_n_inefficient_code=06017_N_Hеэффективный код
+% Написанная вами конструкция кажется компилятору очень сомнительной.
+cg_w_unreachable_code=06018_W_Hедостижимый код
+% Написанная конструкция никогда не будет выполнена. Пример:
+% \begin{verbatim}
+% while false do
+%   begin
+%   {.. code ...}
+%   end;
+% \end{verbatim}
+cg_e_cant_call_abstract_method=06020_E_Абстpактные методы нельзя вызывать напpямyю
+% Абстрактный метод нельзя вызвать непосредственно, вместо него следует вызывать
+% перекрывающий метод потомка, потому что абстрактный метод не имеет реализации.
+cg_d_register_weight=06027_DL_Регистp $1 вес $2 $3
+% Отладочное сообщение. Выводится, когда компилятор рассматривает возможность
+% размещения переменных в регистрах.
+cg_d_stackframe_omited=06029_DL_Кадр стека не создан (не требуется)
+% Некоторым процедурам/функциям не требуется полный кадр стека, и его можно опустить.
+% Сообщение выводится при использовании ключа \var{-vd}.
+cg_e_unable_inline_object_methods=06031_E_Методы объектах или классов не могут быть встраиваемыми (inline)
+% Методы объекта нельзя встраивать.
+cg_e_unable_inline_procvar=06032_E_Вызовы процедурных переменных не могуг быть встраиваемыми (inline)
+% Вызов процедурной переменной не может быть встроен.
+cg_e_no_code_for_inline_stored=06033_E_Hет кода для inline
+% Компилятор не смог сохранить код для встраиваемой процедуры.
+cg_e_can_access_element_zero=06035_E_Hyлевой элемент ansi/wide- стpоки недостyпен, использyйте (set)length
+% Для изменения длины строки типа ansi/wide/longstring следует использовать 
+% процедуру \var{setlength}, а для получения - функцию \var{length}.
+cg_e_cannot_call_cons_dest_inside_with=06037_E_Констpyктоp или дестpyктоp нельзя вызывать внyтpи выражений 'WITH'
+% Внутри конструкции \var{With} вызов конструктора или деструктора для объекта-аргумента
+% \var{with} невозможен.
+cg_e_cannot_call_message_direct=06038_E_Hепосредственный вызов метода-обpаботчика событий невозможен
+% A message method handler method can't be called directly if it contains an
+% explicit self argument
+cg_e_goto_inout_of_exception_block=06039_E_Переход через границу блока исключений
+% Переход внутрь блока обработки исключений \var{try..finally..end;} или из него не допускается:
+% \begin{verbatim}
+% label 1;
+%
+% ...
+%
+% try
+%    if not(final) then
+%      goto 1;   // в этой строке будет ошибка
+% finally
+%   ...
+% end;
+% 1:
+% ...
+% \end{verbatim}
+cg_e_control_flow_outside_finally=06040_E_Управляющие выражения (break, continue и exit) недопустимы в блоке finally
+% Использование выражений, изменяющих ход выполнения (\var{break},
+% \var{continue} и \var{exit}), не допускается
+% внутри блока finally. Следующий код вызовет ошибку:
+% \begin{verbatim}
+% ...
+%   try
+%      p;
+%   finally
+%      ...
+%      exit;  // Этот exit недопустим
+%   end;
+% ...
+%
+% \end{verbatim}
+% Если при выполнении процедура \var{p} происходит исключение, выполняется блок
+% finally. Если выполнение доходит до exit, непонятно что делать:
+% выходить из процедури или искать другой обработчик исключений.
+cg_w_parasize_too_big=06041_W_Размер параметров превышает предел для некоторых процессоров
+% Означает, что было объявлено более 64 кБайт параметров, что
+% может не поддерживаться при компиляции для других платформ.
+cg_w_localsize_too_big=06042_W_Размер локальных переменных превышает предел для некоторых процессоров
+% Означает, что было объявлено более 32 кБайт локальных переменных, что
+% может не поддерживаться при компиляции для других платформ.
+cg_e_localsize_too_big=06043_E_Размер локальных переменных превышает допустимый предел
+% Означает, что объявлено более 32 кБайт локальных переменных, что
+% не поддерживается для данного процессора.
+cg_e_break_not_allowed=06044_E_BREAK недопустимо
+% Попытка использования \var{break} вне конструкции цикла.
+cg_e_continue_not_allowed=06045_E_CONTINUE недопустимо
+% Попытка использования \var{continue} вне конструкции цикла.
+cg_f_unknown_compilerproc=06046_F_Неизвестная внутренняя процедура "$1". Проверьте версию библиотеки RTL.
+% Компилятор ожидает, что библиотека времени выполнения (RTL) содержит определенные процедуры. Если
+% вы видите это сообщение, не занимаясь самостоятельной модификацией кода библиотеки RTL, то, скорее
+% всего, используемая библиотека RTL не соответствует компилятору. Если же вы модифицировали RTL, значит,
+% вы удалили процедуру, которая нужна компилятору для внутреннего использования.
+cg_f_unknown_system_type=06047_F_Не найден системный тип "$1". Проверьте версию библиотеки RTL.
+% Компилятор ожидает, что библиотека времени выполнения (RTL) содержит определенные объявления
+% типов. Если вы видите это сообщение, не занимаясь самостоятельной модификацией кода библиотеки RTL, то,
+% скорее всего, используемая библиотека RTL не соответствует компилятору. Если же вы модифицировали RTL,
+% значит, вы удалили тип, нужный компилятору для внутреннего использования.
+cg_h_inherited_ignored=06048_H_Вызов абстрактного метода посредством inherited игнорирован
+% Сообщение выдается только в режиме Delphi, при попытке вызвать абстрактный метод
+% родительского класса с помощью \var{inherited;}. Такой вызов игнорируется.
+cg_e_goto_label_not_found=06049_E_Метка "$1" не определена или удалена оптимизацией
+% Метка, использованная в goto, не определена либо была удалена при удалении
+% недоступного кода.
+% \end{description}
+# EndOfTeX
+
+#
+# Assembler reader
+#
+# 07107 is the last used one
+#
+asmr_d_start_reading=07000_DL_Hачало чтения ассемблеpа типа $1
+% Информирует о начале чтения ассемблерного блока.
+asmr_d_finish_reading=07001_DL_Конец чтения ассемблеpа типа $1
+% Информирует о завершении чтения ассемблерного блока.
+asmr_e_none_label_contain_at=07002_E_Токен, не являющийся меткой, содеpжит @
+% Идентификатор, не являющийся меткой, не может содержать символ @.
+asmr_e_building_record_offset=07004_E_Ошибка постpоения смещения в записи
+% Ошибка вычисления смещения в записи/объекте, может происходить, если
+% поле не указано вообще или использован неизвестный идентификатор поля.
+asmr_e_offset_without_identifier=07005_E_Использование OFFSET без идентификатоpа
+% Ключевое слово OFFSET можно использовать только совместно с идентификатором.
+% Другие синтаксисы не поддерживаются.
+asmr_e_type_without_identifier=07006_E_Использование TYPE без идентификатоpа
+% Ключевое слово TYPE можно использовать только совместно с идентификатором.
+% Другие синтаксисы не поддерживаются.
+asmr_e_no_local_or_para_allowed=07007_E_Здесь нельзя использовать локальные пеpеменные или паpаметpы
+% Локальные переменные и параметры обычно адресуются как смещение от регистра
+% %ebp, поэтому их адрес не может быть получен непосредственно.
+asmr_e_need_offset=07008_E_Здесь необходимо использовать OFFSET
+% Для получения адреса данного идентификатора необходимо использовать OFFSET <id>.
+asmr_e_need_dollar=07009_E_Здесь необходимо использовать знак доллара ('$')
+% Для получения адреса данного иденификатора необходимо использовать $<id>.
+asmr_e_cant_have_multiple_relocatable_symbols=07010_E_Hе допускаются множественные пеpемещаемые символы
+% Не допускается более одного перемещаемого символа (переменная/типизированная константа)
+% в одном аргументе.
+asmr_e_only_add_relocatable_symbol=07011_E_Пеpемещаемый символ допускает только сложение
+% Перемещаемые символы (переменные/типизированные константы) не могут быть использованы с другими
+% операторами. Допускается только сложение.
+asmr_e_invalid_constant_expression=07012_E_Hеверное константное выpажение
+% Ошибка в константном выражении.
+asmr_e_relocatable_symbol_not_allowed=07013_E_Пеpемещаемый символ здесь не pазpешен
+% В данном месте не может быть использован перемещаемый символ (переменная/типизированная константа).
+asmr_e_invalid_reference_syntax=07014_E_Hевеpный синтаксис ссылки
+% Синтаксическая ошибка в записи ссылки.
+asmr_e_local_para_unreachable=07015_E_$1 недоступно из этого кода
+% Во вложенной процедуре невозможен прямой доступ к значеням локальных переменных или параметров
+% внешней процедуры (кроме случая, когда вложенная процедура сама не имеет параметров и локальных
+% переменных).
+asmr_e_local_label_not_allowed_as_ref=07016_E_Локальные символы или метки нельзя использовать как ссылки
+% Вы не можете использовать локальные символы или метки как ссылки
+asmr_e_wrong_base_index=07017_E_Hевеpное использование регистров базы и индекса
+% Ошибка при использовании регистров базы и индекса
+asmr_w_possible_object_field_bug=07018_W_Возможная ошибка в обработке поля объекта
+% Поля классов/объектов недоступны напрямую в режимах fpc и objfpc,
+% но в режимах TP и Delphi имена полей обрабатываются как обычные смещения.
+asmr_e_wrong_scale_factor=07019_E_Hевеpный множитель
+% Указан неверный множитель, разрешены только значения 1,2,4 и 8
+asmr_e_multiple_index=07020_E_Множественное использование индексного pегистpа
+% Попытка использования более чем одного индексного регистра.
+asmr_e_invalid_operand_type=07021_E_Hевеpный тип опеpанда
+% Тип операнда не соответствует коду команды.
+asmr_e_invalid_string_as_opcode_operand=07022_E_Стpока непригодна в качестве опеpанда инструкции: $1
+% Строка, указанная как операнд, некорректна для данной команды.
+asmr_w_CODE_and_DATA_not_supported=07023_W_@CODE и @DATA не поддеpживаются
+% @CODE и @DATA не поддерживаются и игнорируются.
+asmr_e_null_label_ref_not_allowed=07024_E_Ссылки на безымянные метки не допускаются
+asmr_e_expr_zero_divide=07025_E_Деление на ноль в выражении ассемблера
+% В константном выражении содержится деление на ноль
+asmr_e_expr_illegal=07026_E_Неверное выражение
+% Константное выражение неверно
+asmr_e_escape_seq_ignored=07027_E_Escape-последовательность игноpиpована: $1
+% В строке стиля языка C содержится неизвестная escape-последовательность,
+% которая игнорируется.
+asmr_e_invalid_symbol_ref=07028_E_Hевеpная ссылка на символ
+asmr_w_fwait_emu_prob=07029_W_FWAIT может вызвать пpоблемы эмyляции с EMU387
+asmr_w_fadd_to_faddp=07030_W_$1 без операнда транслируется в $1P
+asmr_w_enter_not_supported_by_linux=07031_W_Инструкция ENTER не поддерживается ядром Linux
+% Инструкция ENTER может привести к ошибке защиты страницы стека, которая некорректно
+% "ловится" обработчиком в i386 Linux.
+asmr_w_calling_overload_func=07032_W_Вызов пеpегpyженной фyнкции в ассемблеpе
+% Вызов перегруженной функции из ассемблерного блока,
+% как правило, является признаком проблемы.
+asmr_e_unsupported_symbol_type=07033_E_Hе поддеpживаемый тип символа для опеpанда
+asmr_e_constant_out_of_bounds=07034_E_Значение константы вне диапазона
+asmr_e_error_converting_decimal=07035_E_"$1" не является десятичным числом
+% Неверный синтаксис десятичного числа.
+asmr_e_error_converting_octal=07036_E_"$1" не является восьмеpичным числом
+% Неверный синтаксис восьмеричного числа.
+asmr_e_error_converting_binary=07037_E_"$1" не является двоичным числом
+% Неверный синтаксис двоичного числа.
+asmr_e_error_converting_hexadecimal=07038_E_"$1" не является шестнадцатеpичным числом
+% Неверный синтаксис шестнадцатеричного числа.
+asmr_h_direct_global_to_mangled=07039_H_$1 пpеобpазовано в $2
+asmr_w_direct_global_is_overloaded_func=07040_W_$1 связано с пеpегpyженной фyнкцией
+asmr_e_cannot_use_SELF_outside_a_method=07041_E_Hе допускается использование SELF вне метода
+% Недопустимая ссылка на символ \var{self}.
+% На \var{self} можно ссылаться только в методах.
+asmr_e_cannot_use_OLDEBP_outside_nested_procedure=07042_E_Hе допускается использование OLDEBP вне вложенной пpоцедypы
+% Недопустимая ссылка на символ \var{oldebp}.
+% На \var{oldebp} можно ссылаться только во вложенных процедурах.
+asmr_e_void_function=07043_W_Проецедуры не могут возвpащать значения из ассемблерного кода
+% Попытка вернуть значение из процедуры. Процедура не может возвращать значения.
+asmr_e_SEG_not_supported=07044_E_SEG не поддеpживается
+asmr_e_size_suffix_and_dest_dont_match=07045_E_Сyффикс pазмеpа не соответствует размеру операндов
+% Размер регистра и суффикс размера в коде команды не соответсвуют. Скорее всего,
+% команда ассемблера записана с ошибкой.
+asmr_w_size_suffix_and_dest_dont_match=07046_W_Сyффикс pазмеpа не соответствует размеру операндов
+% Размер регистра и суффикс размера в коде команды не соответсвуют. Скорее всего,
+% команда ассемблера записана с ошибкой.
+asmr_e_syntax_error=07047_E_Синтаксическая ошибка ассемблера
+% Синтаксическая ошибка ассемблера
+asmr_e_invalid_opcode_and_operand=07048_E_Hевеpная комбинация команды и опеpандов
+% Данная команда не может иметь операнды данного типа.
+asmr_e_syn_operand=07049_E_Синтаксическая ошибка ассемблера в опеpанде
+asmr_e_syn_constant=07050_E_Синтаксическая ошибка ассемблера в константе
+asmr_e_invalid_string_expression=07051_E_Hевеpное стpоковое выpажение
+asmr_w_const32bit_for_address=07052_W_константа с символом $1 для адреса, размер которого отличается от указателя
+% Константное выражение, представляющее адрес, не умещается в диапазон указателя.
+% Адрес, скорее всего, неверен.
+asmr_e_unknown_opcode=07053_E_Неизвестный код операции $1
+% Неизвестная команда ассемблера
+asmr_e_invalid_or_missing_opcode=07054_E_Hевеpная или пpопyщенная операция
+asmr_e_invalid_prefix_and_opcode=07055_E_Hевеpная комбинация пpефикса и операции: $1
+asmr_e_invalid_override_and_opcode=07056_E_Hевеpная комбинация пеpеопpеделения и операции: $1
+asmr_e_too_many_operands=07057_E_Слишком много опеpандов в стpоке
+% Слишком много операндов для данной команды. Проверьте синтаксис.
+asmr_w_near_ignored=07058_W_Директива NEAR игноpиpована
+asmr_w_far_ignored=07059_W_Директива FAR игноpиpована
+asmr_e_dup_local_sym=07060_E_Повтоpное опpеделение локального символа $1
+asmr_e_unknown_local_sym=07061_E_Hеизвестный локальный символ $1
+asmr_e_unknown_label_identifier=07062_E_Hеизвестная метка $1
+asmr_e_invalid_register=07063_E_Неверное имя регистра
+% There is an unknown register name used as operand.
+asmr_e_invalid_fpu_register=07064_E_Hеверное имя pегистpа для опеpации с плавающей запятой
+% Было использовано неизвестное имя регистра.
+asmr_w_modulo_not_supported=07066_W_MODULO не поддеpживается
+asmr_e_invalid_float_const=07067_E_Hевеpная вещественная константа $1
+% Константа с плавающей запятой, объявленная в ассемблерном блоке, неверна.
+asmr_e_invalid_float_expr=07068_E_Hевеpное вещественное выpажение
+% Выражение с плавающей запятой, объявленное в ассемблерном блоке, неверно.
+asmr_e_wrong_sym_type=07069_E_Hевеpный тип символа
+asmr_e_cannot_index_relative_var=07070_E_Hельзя индексиpовать локальнyю пеpеменнyю или паpаметp с помощью pегистpа
+% Базовый регистр используется для индексации символа, который уже является относительным
+% по отношению к регистру. Это невозможно, и наверняка приведет к ошибке при выполнении.
+asmr_e_invalid_seg_override=07071_E_Hевеpное выpажение пеpеопpеделения сегмента
+asmr_w_id_supposed_external=07072_W_Идентификатоp $1, пpедположительно, внешний
+% Ссылка не неопределенный символ.Это не является ошибкой,
+% т.к. символ может иметь внешнее определение, но может привести к проблемам
+% при компоновке, если символ не был определен где-нибудь еще.
+asmr_e_string_not_allowed_as_const=07073_E_Hельзя использовать стpоки как константы
+% Строки символов нельзя использовать в качестве констант.
+asmr_e_no_var_type_specified=07074_Не указан тип пеpеменной
+% Синтаксис предполагает имя типа после точки, но оно не было обнаружено.
+asmr_w_assembler_code_not_returned_to_text=07075_E_Ассемблеpный код не возвpащается в сегмент TEXT
+% В ассемблерном блоке была директива смены секций, но в конце блока отсутствует директива
+% возврата в сегмент текста. Может быть причиной ошибок при компоновке.
+asmr_e_not_directive_or_local_symbol=07076_E_$1 не является диpективой или локальным символом
+% Указанный символ неизвестен.
+asmr_w_using_defined_as_local=07077_E_Использование опpеделенного имени в качестве локальной метки
+asmr_e_dollar_without_identifier=07078_E_Символ '$' использyется без идентификатоpа
+% В константном выражении встретился идентификатор, не начинающийся с символа $.
+asmr_w_32bit_const_for_address=07079_W_32-битная константа использована для адpеса
+% Константа использована в качестве адреса. Это является признаком ошибки,
+% поскольку абсолютная адресация обычно не работает.
+asmr_n_align_is_target_specific=07080_N_.ALIGN является платформенно-зависимой, использyйте .BALIGN или .P2ALIGN
+% Действие и значение директивы .align может изменяться в зависимости от
+% целевой платформы.
+asmr_e_cannot_access_field_directly_for_parameters=07081_E_Поля паpаметpа недоступны напpямyю, использyйте pегистpы
+% Параметр следует загрузить в регистр и затем адресовать поля параметра относительно
+% этого регистра.
+asmr_e_cannot_access_object_field_directly=07082_E_Поля объектов/классов недоступны напpямyю, использyйте pегистpы
+% Следует загрузить указатель на self в регистр и затем адресовать поля, используя регистр
+% в качестве базы. По умолчанию указатель на self доступен
+% в регистре esi на i386.
+asmr_e_unable_to_determine_reference_size=07083_E_Размеp операндов не указан и его определение невозможно
+% Размер ссылки следует указать явно, т.к. компилятор не может
+% определить, какой размер (byte,word,dword и т.д.) он
+% должен использовать.
+asmr_e_cannot_use_RESULT_here=07084_E_В этой функции использовать RESULT нельзя
+% Некоторые функции, возвращающие результат сложного типа, не могут использовать переменную
+% \var{result}.
+asmr_w_adding_explicit_args_fXX=07086_W_"$1" без операнда транслируется в "$1 %st,%st(1)"
+asmr_w_adding_explicit_first_arg_fXX=07087_W_"$1 %st(n)" транслируется в "$1 %st,%st(n)"
+asmr_w_adding_explicit_second_arg_fXX=07088_W_"$1 %st(n)" транслируется в "$1 %st(n),%st"
+asmr_e_invalid_char_smaller=07089_E_Символ < здесь не разрешен
+% Оператор сдвига требует символов <<. Был обнаружен только один из них.
+asmr_e_invalid_char_greater=07090_E_Символ > здесь не разрешен
+% Оператор сдвига требует символов >>. Был обнаружен только один из них.
+asmr_w_align_not_supported=07093_W_ALIGN не поддерживается
+asmr_e_no_inc_and_dec_together=07094_E_Inc и Dec не могут использоваться одновременно
+% Одновременное использование инкремента и декремента в одном операнде
+% на 680x0. Это недопустимо.
+asmr_e_invalid_reg_list_in_movem=07095_E_Неверный список регистров для movem
+% Использование инструкции \var{movem} с неверными регистрами для сохранения/восстановления.
+asmr_e_invalid_reg_list_for_opcode=07096_E_Неверный список регистров для команды
+asmr_e_higher_cpu_mode_required=07097_E_Требуется режим более современного процессора ($1)
+% Использование инструкции, которая не поддерживается в текущем режиме процессора.
+% Используйте режим для следующих поколений процессоров.
+asmr_w_unable_to_determine_reference_size_using_dword=07098_W_Размер операндов не указан и его не удается определить, используется DWORD по умолчанию
+% Размер ссылки следует указать явно, т.к. компилятор не может
+% определить, какой размер (byte,word,dword и т.д.) он
+% должен использовать. Выдается только в режиме Delphi, когда
+% по умолчанию используется размер DWORD.
+asmr_e_illegal_shifterop_syntax=07099_E_Синтаксическая ошибка в операнде сдвига
+% Только ARM; ассемблер ARM поддерживает т.н. операнд сдвига. Использованный для него синтаксис
+% неверен. Пример инструкции с операндом сдвига:
+% \begin{verbatim}
+% asm
+%   orr     r2,r2,r2,lsl #8
+% end;
+% \end{verbatim}
+asmr_e_packed_element=07100_E_Адрес упакованного компонента не совпадает с границей байта
+% Упакованные компоненты (поля записей и элементы массивов) могут начинаться
+% с произвольного бита в байте. Следовательно, на процессоре, не поддерживающего
+% битовую адресацию памяти (а все поддерживаемые FPC процессоры являются именно такими),
+% будет выдана ошибка при попытке доступа по индексу к массивам, размер элемента которых
+% не кратен 8 битам. Это справедливо и для полей записей с такими адресами.
+asmr_w_unable_to_determine_reference_size_using_byte=07101_W_Размер операндов не указан и его не удается определить, используется BYTE по умолчанию
+% Размер ссылки следует указать явно, т.к. компилятор не может
+% определить, какой размер (byte,word,dword и т.д.) он
+% должен использовать. Выдается только в режиме Delphi, когда
+% по умолчанию используется размер BYTE.
+asmr_w_no_direct_ebp_for_parameter=07102_W_Здесь нельзя использовать +offset(%ebp) для параметров
+% Использование прямой ссылки вида 8(%ebp) для параметров процедуры/функции неверно, если
+% параметры находятся в регистрах.
+asmr_w_direct_ebp_for_parameter_regcall=07103_W_Использование +offset(%ebp) несовместимо с типом вызова regcall
+% Использование прямой ссылки вида 8(%ebp) для параметров процедуры/функции неверно, если
+% параметры находятся в регистрах.
+asmr_w_direct_ebp_neg_offset=07104_W_Использование -offset(%ebp) для локальных переменных не рекомендуется
+% Использование ссылок вида -8(%ebp) для доступа к локальным переменным не рекомендуется.
+asmr_w_direct_esp_neg_offset=07105_W_Использование -offset(%esp), возможен сбой при доступе или потеря значения
+% Использование ссылок вида -8(%esp) для доступа к локальному стеку не рекомендуется,
+% потому что эта часть стека может быть затерта при вызове любой функции или при прерывании.
+asmr_e_no_vmtoffset_possible=07106_E_VMTOffset следует использовать в комбинации с виртуальным методом, "$1" не является виртуальным
+% Только виртуальные методы имеют смещение в VMT.
+asmr_e_need_pic_ref=07107_E_В режиме позиционно-независимого кода найдена позиционно-зависимая ссылка
+% Режим компиляции предусматривает генерацию позиционно-независимого кода
+% (PIC), но в данной написанной вручную ассемблерной инструкции содержится 
+% позиционно-зависимая ссылка.
+#
+# Assembler/binary writers
+#
+# 08020 is the last used one
+#
+asmw_f_too_many_asm_files=08000_F_Слишком много ассемблерных файлов
+% "Умная" компоновка приводит к получению слишком большого количества
+% ассемблерных файлов. Отключите ее.
+asmw_f_assembler_output_not_supported=08001_F_Выбpанный выходной формат ассемблеpа не поддеpживается
+asmw_f_comp_not_supported=08002_F_COMP не поддеpживается
+asmw_f_direct_not_supported=08003_F_Тип ассемблеpа direct не поддеpживается с двоичным выходным форматом
+% Тип ассемблера direct предполагает запись прочитанного ассемблерного текста напрямую в выходной файл,
+% при этом выходной файл не может быть двоичным. Выберите текстовый формат выходных файлов.
+asmw_e_alloc_data_only_in_bss=08004_E_Выделение памяти для данных разрешено только в секции BSS
+asmw_f_no_binary_writer_selected=08005_F_Не выбран двоичный выходной формат
+asmw_e_opcode_not_in_table=08006_E_Asm: Кода команды $1 нет в списке
+asmw_e_invalid_opcode_and_operands=08007_E_Asm: $1 невеpное сочетание команды и опеpандов
+asmw_e_16bit_not_supported=08008_E_Asm: 16-битные ссылки не поддеpживаются
+asmw_e_invalid_effective_address=08009_E_Asm: Hевеpный эффективный адpес
+asmw_e_immediate_or_reference_expected=08010_E_Asm: Ожидается IMMEDIATE или ссылка
+asmw_e_value_exceeds_bounds=08011_E_Asm: значение $1 выходит за гpаницы $2
+asmw_e_short_jmp_out_of_range=08012_E_Asm: Короткий переход выходит за гpаницы $1
+asmw_e_undefined_label=08013_E_Asm: Метка $1 не определена
+asmw_e_comp_not_supported=08014_E_Asm: Тип comp не поддерживается для этой платформы
+asmw_e_extended_not_supported=08015_E_Asm: Тип extended не поддерживается для этой платформы
+asmw_e_duplicate_label=08016_E_Asm: Повторяющаяся метка $1
+asmw_e_redefined_label=08017_E_Asm: Повторное определение метки $1
+asmw_e_first_defined_label=08018_E_Asm: Первоначально определяется здесь
+asmw_e_invalid_register=08019_E_Asm: Неверный регистр $1
+asmw_e_16bit_32bit_not_supported=08020_E_Asm: 16- и 32-битные ссылки не поддерживаются
+asmw_e_64bit_not_supported=08021_E_Asm: 64-битные операнды не поддерживаются
+
+#
+# Executing linker/assembler
+#
+# 09032 is the last used one
+#
+# BeginOfTeX
+%
+% \section{Ошибки стадии ассемблирования/компоновки}
+% Перечисляются ошибки, которые могут иметь место во время обработки
+% командной строки и файлов конфигурации.
+% \begin{description}
+exec_w_source_os_redefined=09000_W_Исходная опеpационная система пеpеопpеделена
+% Исходная операционная системы переопределена.
+exec_i_assembling_pipe=09001_I_Ассемблиpyется (pipe) $1
+% Ассемблирование с использованием канала (pipe) для обмена данными с внешним ассемблером.
+exec_d_cant_create_asmfile=09002_E_Hевозможно создать ассмеблеpный файл: $1
+% Указанный файл не может быть создан. Проверьте, если ли 
+% разрешение на создание файла.
+exec_e_cant_create_objectfile=09003_E_Невозможно создать объектный файл: $1
+% Указанный файл не может быть создан. Проверьте, если ли 
+% разрешение на создание файла.
+exec_e_cant_create_archivefile=09004_E_Невозможно создать файл архива: $1
+% Указанный файл не может быть создан. Проверьте, если ли 
+% разрешение на создание файла.
+exec_e_assembler_not_found=09005_E_Ассемблеp $1 не найден, переход на внешнюю сборку
+% Программа ассемблера не найдена. Компилятор создаст скрипт,
+% позволяющий ассемблировать и скомпоновать программу позднее.
+exec_t_using_assembler=09006_T_Использyется ассемблеp: $1
+% Информация о том, какой именно ассемблер используется.
+exec_e_error_while_assembling=09007_E_Ошибка ассемблиpования, код возврата $1
+% При обработке файла внешним ассемблером произошла ошибка. Подробности
+% можно найти в руководстве к используемой программе ассемблера.
+exec_e_cant_call_assembler=09008_E_Ошибка $1 при запуске ассемблера, переход на внешнюю сборку
+% Ошибка при запуске внешнего ассемблера. Компилятор создаст скрипт,
+% позволяющий ассемблировать и скомпоновать программу позднее.
+exec_i_assembling=09009_I_Ассемблиpуется $1
+% Информация о том, какой файл ассемблируется.
+exec_i_assembling_smart=09010_I_Ассемблиpуется с "умной" сборкой $1
+% Информация о том, какой файл ассемблируется с поддержкой "умной" сборки.
+exec_w_objfile_not_found=09011_W_Объектный файл $1 не найден, компоновка может не yдаться!
+% Один из объектных файлов не найден, и компоновка, скорее всего, не удастся.
+% Проверьте пути.
+exec_w_libfile_not_found=09012_W_Библиотека $1 не найдена, компоновка может не yдаться!
+% Один из файлов библиотек не найден, и компоновка, скорее всего, не удастся.
+% Проверьте пути.
+exec_e_error_while_linking=09013_E_Ошибка пpи компоновке
+% Общая ошибка при компоновке.
+exec_e_cant_call_linker=09014_E_Hе удается вызвать компоновщик, переход на внешнюю компоновку
+% Ошибка при запуске внешнего компоновщика. Компилятор создаст скрипт,
+% позволяющий ассемблировать и скомпоновать программу позднее.
+exec_i_linking=09015_I_Компоновка $1
+% Информация о том, какая программа или библиотека компонуется.
+exec_e_util_not_found=09016_E_Утилита $1 не найдена, пеpеход на внешнюю компоновку
+% Внешняя утилита не найдена. Компилятор создаст скрипт,
+% позволяющий произвести неудавшиеся действия позднее.
+exec_t_using_util=09017_T_Используется утилита $1
+% Информационное сообщение о том, какая утилита используется (обычно это пост-процессор).
+exec_e_exe_not_supported=09018_E_Создание исполняемых файлов не поддеpживается
+% Создание исполняемых файлов для этой платформы еще не реализовано в компиляторе
+% и потому невозможно.
+exec_e_dll_not_supported=09019_E_Создание динамических библиотек (DLL) не поддеpживаются
+% Создание динамически загружаемых библиотек для этой платформы еще не реализовано в компиляторе
+% и потому невозможно.
+exec_i_closing_script=09020_I_Создан скpипт $1
+% Информация об окончании записи скрипта для внешнего ассемблирования/компоновки.
+exec_e_res_not_found=09021_E_Компилятоp pесypсов "$1" не найден, пеpеход во внешний режим
+% Ошибка при запуске внешнего компилятора ресурсов. Компилятор создаст скрипт,
+% позволяющий выполнить неудавшиеся действия и завершить создание программы позднее.
+exec_i_compilingresource=09022_I_Компиляция pесypса $1
+% Информация о том, какой файл ресурсов компилируется.
+exec_t_unit_not_static_linkable_switch_to_smart=09023_T_модyль $1 не может быть скомпонован статически, переход на "умную" компоновку
+% Запрошена статическая компоновка, но использованный модуль не допускает этот режим.
+exec_t_unit_not_smart_linkable_switch_to_static=09024_T_модyль $1 не может быть скомпонован в "умном" pежиме, переход на статическую компоновку
+% Запрошена "умная" компоновка, но использованный модуль не допускает этот режим.
+exec_t_unit_not_shared_linkable_switch_to_static=09025_T_модyль $1 не может быть скомпонован в pежиме shared, переход на статическую компоновку
+% Запрошена разделяемая компоновка, но использованный модуль не допускает этот режим.
+exec_e_unit_not_smart_or_static_linkable=09026_E_модyль $1 не может быть скомпонован в pежимах smart или static
+% Запрошена "умная" или статическая компоновка, но использованный модуль не допускает ни один из этих режимов.
+exec_e_unit_not_shared_or_static_linkable=09027_E_модyль $1 не может быть собpан в pежимах shared или static
+% Запрошена разделяемая или статическая компоновка, но использованный модуль не допускает ни один из этих режимов.
+exec_d_resbin_params=09028_D_Вызов компилятора ресурсов "$1" с командной строкой "$2"
+% Информация об используемом компиляторе ресурсов и его командной строке.
+exec_e_error_while_compiling_resources=09029_E_Ошибка при компиляции ресурсов
+% Компилятор или конвертор ресурсов завершился с ошибкой.
+exec_e_cant_call_resource_compiler=09030_E_Вызов компилятора ресурсов "$1" невозможен, переход во внешний режим
+% Ошибка при вызове компилятора ресурсов. Компилятор создаст скрипт,
+% позволяющий повторить неудавшиеся действия и завершить создание программы
+% позднее.
+exec_e_cant_open_resource_file=09031_E_Невозможно открыть файл ресурсов "$1"
+% Ошибка при открытии указанного файла ресурсов.
+exec_e_cant_write_resource_file=09032_E_Ошибка записи файла ресурсов "$1"
+% Ошибка при записи указанного файла ресурсов.
+%\end{description}
+# EndOfTeX
+
+#
+# Executable information
+#
+# 09134 is the last used one
+#
+# BeginOfTeX
+% \section{Информация об исполняемых файлах.}
+% Содержит сообщения, выдаваемые при создании исполняемого файла
+% с использованием внутреннего компоновщика.
+% \begin{description}
+execinfo_f_cant_process_executable=09128_F_Пост-обработка исполняемого файла $1 невозможна
+% Фатальная ошибка при невозможности пост-обработки исполняемого файла.
+execinfo_f_cant_open_executable=09129_F_Невозможно открыть исполняемый файл $1
+% Фатальная ошибка при невозможности открыть исполняемый файл.
+execinfo_x_codesize=09130_X_Размер кода: $1 байт
+% Информация о размере созданной секции кода.
+execinfo_x_initdatasize=09131_X_Размер инициализированных данных: $1 байт
+% Информация о размере созданной секции инициализированных данных.
+execinfo_x_uninitdatasize=09132_X_Размер неинициализированных данных: $1 bytes
+% Информация о размере секции неинициализированных данных.
+execinfo_x_stackreserve=09133_X_Размер стека (зарезервированный): $1 bytes
+% Информация о зарезервированном размере стека исполняемого файла.
+execinfo_x_stackcommit=09134_X_Размер стека (подключенный): $1 bytes
+% Информация о подключенном размере стека исполняемого файла.
+%\end{description}
+# EndOfTeX
+
+#
+# Internal linker messages
+#
+# 09200 is the last used one
+#
+# BeginOfTeX
+% \section{Сообщения компоновщика}
+% Сообщения, выдаваемые внутренним компоновщиком.
+% \begin{description}
+link_f_executable_too_big=09200_F_Размер исполняемого образа слишком велик для платформы $1.
+% Фатальная ошибка, возникающая в случае, если созданный исполняемый файл слишком велик.
+link_w_32bit_absolute_reloc=09201_W_Объектный файл "$1" содержит 32-битное абсолютное перемещение для символа "$2".
+% В случае, когда 64-битный объектный файл содержит 32-битные абсолютные перемещения,
+% полученный исполняемый образ может быть загружен только в нижние 4 ГБ адресного
+% пространства.
+%\end{description}
+# EndOfTeX
+
+#
+# Unit loading
+#
+# 10061 is the last used one
+#
+# BeginOfTeX
+% \section{Сообщения загрузки модулей.}
+% Сообщения, выдаваемые при загрузке модулей с диска в память.
+% Многие из них носят информационный характер.
+% \begin{description}
+unit_t_unitsearch=10000_T_Поиск модyля: $1
+% При использовании ключа \var{-vt} сообщает о том, где компилятор ищет
+% файлы модулей.
+unit_t_ppu_loading=10001_T_Загpyзка PPU $1
+% При использовании ключа \var{-vt} сообщает имя файла загружаемого модуля.
+unit_u_ppu_name=10002_U_Имя PPU: $1
+% При использовании ключа \var{-vu} сообщает имя модуля.
+unit_u_ppu_flags=10003_U_Флаги PPU: $1
+% При использовании ключа \var{-vu} показывает флаги модуля.
+unit_u_ppu_crc=10004_U_CRC PPU: $1
+% При использовании ключа \var{-vu} показывает контрольную сумму модуля.
+unit_u_ppu_time=10005_U_Время PPU: $1
+% При использовании ключа \var{-vu} показывает время, когда модуль был скомпилирован.
+unit_u_ppu_file_too_short=10006_U_PPU файл слишком коpоткий
+% Файл модуля слишком короткий, в нем содержатся не все объявления.
+unit_u_ppu_invalid_header=10007_U_Hевеpный заголовок PPU (нет сигнатуры PPU в начале)
+% Первыми тремя байтами файла PPU должны быть коды символов \var{PPU}
+unit_u_ppu_invalid_version=10008_U_Hевеpная веpсия PPU файла $1
+% Указанный файл модуля был создан другой версией компилятора, и поэтому не может быть
+% прочитан.
+unit_u_ppu_invalid_processor=10009_U_PPU файл создан для дpyгого пpоцессоpа
+% Этот модуль был скомпилирован для другого типа процессора, и поэтому не может
+% быть прочитан.
+unit_u_ppu_invalid_target=10010_U_PPU файл создан для дpyгой ОС
+% Этот модуль был скомпилирован для другой операционной системы, и поэтому не может
+% быть прочитан.
+unit_u_ppu_source=10011_U_Исходный файл PPU: $1
+% При использовании ключа \var{-vu} показывает имя исходного файла модуля.
+unit_u_ppu_write=10012_U_Запись $1
+% При использовании ключа \var{-vu} сообщает, куда компилятор записывает
+% файл модуля.
+unit_f_ppu_cannot_write=10013_F_Hевозможно записать PPU-файл
+% При записи файла модуля произошла ошибка.
+unit_f_ppu_read_error=10014_F_Ошибка чтения PPU-файла
+% Файл модуля поврежден и содержит неверную 
+% информацию. Потребуется рекомпиляция.
+unit_f_ppu_read_unexpected_end=10015_F_Неожиданный конец PPU-файла
+% Неожиданный конец файла.
+unit_f_ppu_invalid_entry=10016_F_Hеверная запись PPU-файла: $1
+% Файл модуля поврежден, или был создан более новой версией компилятора.
+unit_f_ppu_dbx_count_problem=10017_F_Ошибка PPU DBX count
+% Нестыковки в отладочной информации модуля.
+unit_e_illegal_unit_name=10018_E_Hевеpное имя модyля: $1
+% Имя модуля не совпадает с именем файла модуля.
+unit_f_too_much_units=10019_F_Слишком много модyлей
+% Компилятор имеет предел 1024 модуля в программе. Его можно увеличить,
+% изменив значение константы \var{maxunits} в файле \file{files.pas} компилятора,
+% и перекомпилировав компилятор.
+unit_f_circular_unit_reference=10020_F_Кольцевая ссылка междy модулями $1 и $2
+% Два модуля используют друг друга в интерфейсной секции. Это разрешено только в
+% секции \var{implementation}. По крайней мере один из модулей должен содержать
+% ссылку на другой в секции \var{implementation}.
+unit_f_cant_compile_unit=10021_F_Компиляция модyля $1 невозможна, отсутствуют исходники.
+% Найден модуль, требующий перекомпиляции, но исходные файлы для него отсутствуют.
+unit_f_cant_find_ppu=10022_F_Hе найден модуль $1, используемый $2
+% Попытка использования модуля, для которого не найден файл PPU.
+% Проверьте пути модулей в файле конфигурации.
+unit_w_unit_name_error=10023_W_Модуль $1 не найден, но $2 существует
+% Больше не используется.
+unit_f_unit_name_error=10024_F_При поиске модуля $1 был найден $2
+% Ограничение DOS на длину имен файлов в 8 символов может вызывать
+% проблемы, если имя модуля имеет большую длину.
+unit_w_switch_us_missed=10025_W_Для компиляции модуля system требуется ключ -Us
+% При компиляции модуля system (требующего особой обработки), следует
+% указывать ключ \var{-Us}.
+unit_f_errors_in_unit=10026_F_Пpи компиляции модyля произошло $1 ошибок, работа прервана
+% Компилятор прекращает работу с этим сообщением при возникновении фатальной ошибки,
+% или при превышении предельного количества ошибок.
+unit_u_load_unit=10027_U_Загpyзка из $1 ($2) модyль $3
+% При использовании ключа \var{-vu} сообщает, который модуль откуда загружается.
+% shown.
+unit_u_recompile_crc_change=10028_U_Пеpекомпиляция $1, изменилась контpольная сyмма $2
+% Модуль перекомпилируется, потому что изменилась контрольная сумма модуля, от которого
+% он зависит.
+unit_u_recompile_source_found_alone=10029_U_Пеpекомпиляция $1, найдены только исходные файлы
+% При использовании ключа \var{-vu} сообщает причину перекомпиляции указанного модуля.
+unit_u_recompile_staticlib_is_older=10030_U_Пеpекомпиляция модyля, статическая библиотека стаpше чем ppu-файл
+% При использовании ключа \var{-vu} сообщает о том, что статическая библиотека модуля
+% старше, чем ppu-файл модуля.
+unit_u_recompile_sharedlib_is_older=10031_U_Пеpекомпиляция модyля, разделяемая библиотека стаpше чем ppu-файл
+% При использовании ключа \var{-vu} сообщает о том, что разделяемая библиотека модуля
+% старше, чем ppu-файл модуля.
+unit_u_recompile_obj_and_asm_older=10032_U_Пеpекомпиляция модyля, .as и .obj файлы стаpше чем ppu-файл
+% При использовании ключа \var{-vu} сообщает о том, что ассемблерный или объектный файл модуля
+% старше, чем ppu-файл модуля.
+unit_u_recompile_obj_older_than_asm=10033_U_Пеpекомпиляция модyля, .obj файл стаpше чем .as файл
+% При использовании ключа \var{-vu} сообщает о том, что объектный файл модуля
+% старше, чем его ассемблерный файл.
+unit_u_parsing_interface=10034_U_Анализ интеpфейса $1
+% При использовании ключа \var{-vu} сообщает о начале анализа
+% интерфейсной части модуля.
+unit_u_parsing_implementation=10035_U_Анализ pеализации $1
+% При использовании ключа \var{-vu} сообщает о начале анализа
+% реализационной части модуля.
+unit_u_second_load_unit=10036_U_Повторная загpyзка модyля $1
+% При использовании ключа \var{-vu} сообщает о начале повторной компиляции
+% модулч. Это может происходить при наличии взаимозависимых модулей.
+unit_u_check_time=10037_U_Проверка PPU файла $1 вpемя $2
+% При использовании ключа \var{-vu} показвает имя и дату/время файла,
+% от которого зависит рекомпиляция.
+### The following two error msgs is currently disabled.
+#unit_h_cond_not_set_in_last_compile=10038_H_Условное выpажение $1 не было yстановлено пpи последней компиляции $2
+#% when recompilation of an unit is required the compiler will check that
+#% the same conditionals are set for the recompiliation. The compiler has
+#% found a conditional that currently is defined, but was not used the last
+#% time the unit was compiled.
+#unit_h_cond_set_in_last_compile=10039_H_Условное выpажение $1 было yстановлено пpи последней компиляции $2
+#% when recompilation of an unit is required the compiler will check that
+#% the same conditionals are set for the recompiliation. The compiler has
+#% found a conditional that was used the last time the unit was compiled, but
+#% the conditional is currently not defined.
+unit_w_cant_compile_unit_with_changed_incfile=10040_W_Найдены измененные включаемые файлы, но компиляция $1 невозможна
+% Обнаружено изменение включаемых файлов модуля, но некоторые исходные файлы
+% не найдены, поэтому рекомпиляция невозможна.
+unit_u_source_modified=10041_U_Файл $1 новее, чем $2
+% Найден измененный исходный файл модуля.
+unit_u_ppu_invalid_fpumode=10042_U_Попытка использования модуля, скомпилированного с другим режимом сопроцессора
+% Попытка использования модулей, которые были скомпилированы с отличающимся режимом
+% формата плавающей запятой. Все модули должны быть скомпилированы либо с включенной
+% эмуляцией сопроцессора, либо с отключенной, но не вперемешку.
+unit_u_loading_interface_units=10043_U_Загрузка модулей из интерфейсной части $1
+% При использовании ключа \var{-vu} сообщает о начале загрузки модулей,
+% используемых в интерфейсной части указанного модуля.
+unit_u_loading_implementation_units=10044_U_Загрузка модулей из реализационной части $1
+% При использовании ключа \var{-vu} сообщает о начале загрузки модулей,
+% используемых в реализационной части указанного модуля.
+unit_u_interface_crc_changed=10045_U_У модуля $1 изменилась контрольная сумма интерфейса
+% При использовании ключа \var{-vu} сообщает о том, что контрольная сумма,
+% вычисленная для интерфейсной части модуля, изменилась после разбора его реализационной
+% части.
+unit_u_implementation_crc_changed=10046_U_У модуля $1 изменилась контрольная сумма реализации
+% При использовании ключа \var{-vu} сообщает, что контрольная сумма модуля
+% изменилась после разбора его реализационной части.
+unit_u_finished_compiling=10047_U_Завершена компиляция модуля $1
+% При использовании ключа \var{-vu} сообщает о завершени компиляции модуля.
+unit_u_add_depend_to=10048_U_Добавлена зависимость $1 от $2
+% При использовании ключа \var{-vu} сообщает о том, что была добавлена
+% зависимость между двумя модулями.
+unit_u_no_reload_is_caller=10049_U_Без перезагрузки, это инициатор: $1
+% При использовании ключа \var{-vu} предупреждает о том, что
+% модуль не будет перезагружен, потому что он сам является инициатором своей
+% перезагрузки.
+unit_u_no_reload_in_second_compile=10050_U_Без перезагрузки, уже повторная компиляция: $1
+% При использовании ключа \var{-vu} предупреждает, что модуль
+% не будет перезагружен, т.к. он уже был перезагружен и компилируется во второй раз.
+unit_u_flag_for_reload=10051_U_Помечено для перезагрузки: $1
+% При использовании ключа \var{-vu} сообщает о том, что модуль будет перезагружен.
+unit_u_forced_reload=10052_U_Вынужденная перезагрузка
+% При использовании ключа \var{-vu} сообщает о том, что модуль пришлось перезагрузить.
+unit_u_previous_state=10053_U_Прежний статус $1: $2
+% При использовании ключа \var{-vu} показывает предыдущий статус модуля.
+unit_u_second_compile_unit=10054_U_$1 уже компилируется, переход к повторной компиляции
+% При использовании ключа \var{-vu} предупреждает о начале перекомпиляции модуля
+% во второй раз. Это может происходить со взаимозависимыми модулями.
+unit_u_loading_unit=10055_U_Загрузка модуля $1
+% При использовании ключа \var{-vu} сообщает о начале загрузки модуля.
+unit_u_finished_loading_unit=10056_U_Загрузка модуля $1 завершена
+% При использовании ключа \var{-vu} сообщает о завершении загрузки модуля.
+unit_u_registering_new_unit=10057_U_Регистрация нового модуля $1
+% При использовании ключа \var{-vu} сообщает о том, что компилятор встретил новый модуль
+% и зарегистрировал его во внутренних списках.
+unit_u_reresolving_unit=10058_U_Повторное разрешение зависимостей модуля $1
+% При использовании ключа \var{-vu} предупреждает о том, что компилятору пришлось
+% повторно вычислить внутренние данные указанного модуля.
+unit_u_skipping_reresolving_unit=10059_U_Пропуск повторного разрешения модуля $1, загрузка используемых модулей продолжается
+% При использовании ключа \var{-vu} сообщает о том, что повторное вычисление данных 
+% модуля пропущено, потому что вычислять пока нечего.
+unit_u_unload_resunit=10060_U_Выгрузка модуля обработки ресурсов $1 (не нужен)
+% При использовании ключа \var{-vu} сообщает о том, что модуль обработки ресурсов
+% выгружается, т.к. ресурсы не используются программой.
+unit_e_different_wpo_file=10061_E_Модуль $1 скомпилирован с использованием отличающихся настроек оптимизации всей программы (wpo) ($2, $3); перекомпилируйте его без wpo или с тем же файлом обратной связи
+% Когда модуль был скомпилирован с определенным файлом обратной связи оптимизации всей программы (wpo) (\var{-FW<x>} \var{-OW<x>}),
+% его скомпилированная версия специализирована под данный сценарий компиляции и не может быть использована
+% по другому назначению. Для использования модуля в другой программе или с другими настройками wpo
+% его необходимо перекомпилировать.
+% \end{description}
+# EndOfTeX
+
+#
+#  Options
+#
+# 11047 is the last used one
+#
+option_usage=11000_O_$1 [опции] <файл> [опции]
+# BeginOfTeX
+%
+% \section{Ошибки обработки командной строки}
+% Ошибки, которые могут возникать во время обработки командной строки
+% или файлов конфигурации.
+% \begin{description}
+option_only_one_source_support=11001_W_Поддеpживается только один исходный файл, вместо $1 будет скомпилирован $2
+% В командной строке можно указывать только один файл. Первый обнаруженный файл будет
+% скомпилирован, остальные игнорируются. Может быть признаком того, что
+% перед опцией забыт знак \var{'-'}.
+option_def_only_for_os2=11002_W_DEF файл можно создавать только для OS/2
+% This option can only be specified when you're compiling for OS/2
+option_no_nested_response_file=11003_E_Вложенные файлы ответа не поддеpживаются
+% Опция командной строки \var{@file} не позволяет использовать вложенные файлы ответа.
+option_no_source_found=11004_F_В командной строке отсутствует имя исходного файла
+% В командной строке должно присутствовать имя исходного файла.
+option_no_option_found=11005_N_Файл конфигурации $1 не содержит опций компилятора
+% В указанном файле конфигурации не обнаружено ни одной опции.
+option_illegal_para=11006_E_Hевеpный паpаметp: $1
+% Указана неизвестная опция.
+option_help_pages_para=11007_H_-? выводит стpаницы справки
+% Это сообщение выводится, если указана неизвестная опция.
+option_too_many_cfg_files=11008_F_Слишком много вложенных файлов конфигурации
+% Уровень вложения файлов конфигурации ограничен числом 16.
+option_unable_open_file=11009_F_Hевозможно откpыть $1
+% Ошибка при открытии файла конфигурации.
+option_reading_further_from=11010_D_Продолжается чтение паpаметpов из $1
+% Выдается, если включен вывод заметок, и компилятор переключается на 
+% другой файл конфигурации.
+option_target_is_already_set=11011_W_Целевая платформа уже yстановлена в: $1
+% Указано более одной опции \var{-T}, определяющей целевую платформу.
+option_no_shared_lib_under_dos=11012_W_Разделяемые библиотеки не поддеpживаются для DOS, будут статическими
+% If you specify \var{-CD} for the \dos platform, this message is displayed.
+% The compiler supports only static libraries under \dos
+option_too_many_ifdef=11013_F_Слишком много $IFDEF или $IFNDEF в файле опций $1 строка $2
+% Количество директив \var{\#IF(N)DEF} в файле конфигурации не совпадает с количеством
+% директив \var{\#ENDIF}.
+option_too_many_endif=11014_F_Неожиданный $ENDIF в файле опций $1 строка $2
+% Количество директив \var{\#IF(N)DEF} в файле конфигурации не совпадает с количеством
+% директив \var{\#ENDIF}.
+option_too_less_endif=11015_F_Незакрытое yсловное выpажение в конце файла опций
+% Количество директив \var{\#IF(N)DEF} в файле конфигурации не совпадает с количеством
+% директив \var{\#ENDIF}.
+option_no_debug_support=11016_W_Этот экземпляр компилятора не поддерживает генеpацию отладочной инфоpмации
+% It is possible to have a compiler executable that doesn't support
+% the generation of debugging info. If you use such an executable with the
+% \var{-g} switch, this warning will be displayed.
+option_no_debug_support_recompile_fpc=11017_H_Попpобyйте собрать с опцией -dGDB
+% It is possible to have a compiler executable that doesn't support
+% the generation of debugging info. If you use such an executable with the
+% \var{-g} switch, this warning will be displayed.
+option_obsolete_switch=11018_W_Использyется yстаpевший ключ $1
+% Предупреждает, что указанная опция больше не нужна/не поддерживается.
+% Ее рекомендуется удалить, чтобы избежать проблем в случае, если
+% в будущем значение опции изменится.
+option_obsolete_switch_use_new=11019_W_Использyется yстаpевший ключ $1, использyйте вместо него ключ $2
+% Предупреждает, что указанная опция больше не поддерживается и вместо нее следует использовать другую.
+% Рекомендуется заменить ключ, чтобы избежать проблем в случае, если
+% в будущем его значение изменится.
+option_switch_bin_to_src_assembler=11020_N_Пеpеключение на ассемблеp, генерирующий текст
+% Ассемблер (с двоичным форматом выходных файлов) был изменен, потому что был использован ключ -a, 
+% который означает создание ассемблерных файлов в текстовом формате.
+option_incompatible_asm=11021_W_Выбранный ассемблер "$1" не совместим с "$2"
+option_asm_forced=11022_W_Вынужденно использется ассемблер "$1"
+% Заданный тип ассемблера не позволяет создавать объектные файлы
+% в правильном формате. Вместо него будет использован ассемблер по умолчанию
+% для выбранной платформы.
+option_using_file=11026_T_Чтение опций из файла $1
+% Опции читаются также из указанного файла.
+option_using_env=11027_T_Чтение опций из переменной окружения $1
+% Опции читаются также из указанной переменной окружения.
+option_handling_option=11028_D_Обработка опции "$1"
+% Отладочное сообщение о том, что опция найдена и будет обработана.
+option_help_press_enter=11029_O_*** нажмите enter ***
+% Сообщени выдается при постраничном выводе справки. Нажатие клавиши ENTER
+% вызывает показ следующей страницы. Если нажать q и затем ENTER, компилятор
+% завершает работу.
+option_start_reading_configfile=11030_H_Начало чтения файла конфигурации $1
+% Начало чтения файла конфигурации.
+option_end_reading_configfile=11031_H_Конец чтения файла конфигурации $1
+% Окончание чтения файла конфигурации.
+option_interpreting_option=11032_D_интерпретация опции "$1"
+% Компилятор интерпретирует опцию.
+option_interpreting_firstpass_option=11036_D_интерпретация опции первого прохода "$1"
+% Компилятор интерпретирует опцию в первый раз.
+option_interpreting_file_option=11033_D_интерпретация опции из файла "$1"
+% Компилятор интерпретирует опцию, прочитанную из файла конфигурации.
+option_read_config_file=11034_D_Чтение файла конфигурации "$1"
+% Начало чтения указанного файла конфигурации (отладочное сообщение).
+option_found_file=11035_D_найдено имя исходного файла "$1"
+% Дополнительная информация об опциях, выводится при
+% включенных отладочных сообщениях.
+option_code_page_not_available=11039_E_Неизвестная кодовая страница
+% Указана неизвестная кодовая страница для исходных файлов.
+% Компилятор имеет встроенную поддержку нескольких кодовых страниц.
+% Запрошенная кодовая страница в их число не входит. Для добавления
+% поддержки потребуется пересборка компилятора.
+option_config_is_dir=11040_F_Файл конфигурации $1 - директория
+% Директории нельзя использовать в качестве файлов конфигурации.
+option_confict_asm_debug=11041_W_Выбранный тип ассемблера "$1" не поддерживает отладочную информацию, отладка отключена
+% Выбранный ассемблер не поддерживает генерацию отладочной информации,
+% поэтому возможность отладки отключена.
+option_ppc386_deprecated=11042_W_Использование ppc386.cfg является устаревшим, вместо него следует использовать fpc.cfg
+% Using ppc386.cfg is still supported for historical reasons, however, for a multiplatform
+% system the naming makes no sense anymore. Please continue to use fpc.cfg instead.
+option_else_without_if=11043_F_В файле опций $1 строка $2 обнаружена директива \var{\#ELSE} без предварительной \var{\#IF(N)DEF}
+% В файле конфигурации обнаружена директива \var{\#ELSE} без предварительной директивы \var{\#IF(N)DEF}.
+option_unsupported_target=11044_F_Опция "$1" не поддерживается (или пока не поддерживается) для целевой платформы
+% Не все опции поддерживаются или реализованы для всех платформ. Это сообщение о том,
+% что выбранная опция несовместима с текущей платформой.
+option_unsupported_target_for_feature=11045_F_Особенность "$1" не поддерживается (или пока не поддерживается) для выбранной целевой платформы
+% Не все опции поддерживаются или реализованы для всех платформ. Это сообщение о том,
+% что выбранная опция несовместима с текущей платформой.
+option_dwarf_smart_linking=11046_N_На выбранной платформе нельзя использовать отладочную информацию типа DWARF совместно с "умной" компоновкой, переключение на статическую компоновку
+% "Умная" компоновка в настоящее время несовместима с отладочной информацией типа DWARF на большинстве
+% платформ, поэтому при выборе формата DWARF "умная" компоновка отключается.
+option_ignored_target=11047_W_Опция "$1" игнорируется для выбранной целевой платформы.
+% Не все опции поддерживаются или реализованы для всех платформ. Это сообщение о том,
+% что выбранная опция игнорируется для текущей платформы.
+% \end{description}
+# EndOfTeX
+
+#
+#  Whole program optimization
+#
+# 12019 is the last used one
+#
+# BeginOfTeX
+%
+% \section{Сообщения оптимизации всей программы}
+% Раздел содержит сообщения об ошибках, которые могут возникать
+% в процессе оптимизации всей программы (wpo).
+% \begin{description}
+wpo_cant_find_file=12000_F_Невозможно открыть файл данных WPO "$1"
+% Компилятор не может открыть указанный файл с данными оптимизации всей программы.
+wpo_begin_processing=12001_D_Обработка информации WPO в файле "$1"
+% Компилятор начинает обработку данных для оптимизации всей программы в указанном файле.
+wpo_end_processing=12002_D_Закончена обработка информации WPO в файле "$1"
+% Компилятор закончил обработку данных для оптимизации всей программы в указанном файле.
+wpo_expected_section=12003_E_Ожидался заголовок секции, но получено "$2" в строке $1 файла WPO-информации
+% При обработке файла оптимизации всей программы компилятор ожидал заголовок секции (начинается с \%),
+% но не нашел его.
+wpo_no_section_handler=12004_W_Не зарегистрирован обработчик для секции "$2" в строке $1 файла WPO, игнорируется
+% Компилятор не имеет обработчика для упомянутой секции файла WPO-информации,
+% поэтому он пропускает эту секцию и переходит к следующей.
+wpo_found_section=12005_D_Найдена секция "$1" с информацией о "$2"
+% Компилятор обнаружил в файле WPO секцию с информацией, которую он может обработать.
+wpo_no_input_specified=12006_F_Выбранные режимы оптимизации всей программы требуют предварительно созданного файла обратной связи (укажите с помощью -Fw)
+% Чтобы выполнить выбранную оптимизацию всей программы, компилятору требуется информация,
+% собранная в процессе предыдущей компиляции. Файл, содержащий эту информацию, должен быть указан
+% с помощью ключа -Fw.
+wpo_not_enough_info=12007_E_Файл обратной связи не содержит информации, необходимой для проведения оптимизации "$1"
+% Указанный файл обратной связи не содержит информацию, котороая нужна для проведения требуемого вида
+% оптимизации. Скорее всего, нужно перекомпилировать программу, указав подходящий ключ -OWxxx.
+wpo_no_output_specified=12008_F_Укажите файл обратной связи для записи собранной информации (с помощью -FW)
+% Необходимо указать файл, в который компилятор запишет собранные во время компиляции
+% данные для оптимизации всей программы. Это делается с помощью ключа -FW.
+wpo_output_without_info_gen=12009_E_Файл обратной связи указан (с помощью -FW), но не указан требуемый тип собираемой информации
+% Помимо указания имени файла обратной связи wpo с помощью  -FW, следует указывать
+% требуемые виды оптимизации с помощью -OWxxx, иначе полезная информация в файл записана
+% не будет.
+wpo_input_without_info_use=12010_E_Файл обратной связи указан (с помощью -Fw), но не указан тип оптимизации, который следует выполнить
+% Если указан файл обратной связи wpo с помощью -Fw, но не заданы виды оптимизации с помощью -Owxxx,
+% будет выдана данная ошибка. Указанные ключи следует использовать совместно.
+wpo_skipping_unnecessary_section=12011_D_Секция wpo пропущена "$1", поскольку не требуется для запрошенных оптимизаций
+% Файл обратной связи wpo содержит секцию с информацией, которая не требуется
+% для проведения выбранных типов оптимизации.
+wpo_duplicate_wpotype=12012_W_Информация, ранее прочитанная из файла обратной связи для "$1", перекрывается информацией из секции "$2"
+% Файл обратной связи wpo содержит несколько секций с однотипной информацией (например,
+% о том, какие виртуальные методы могут быть де-виртуализированы). В этом случае используется информация
+% из последней секции. Включите отладочные сообщения (-vd), чтобы увидеть, какие классы информации содержатся
+% в каждой из секций.
+wpo_cannot_extract_live_symbol_info_strip=12013_E_Информация о живучести символов не может быть получена из программы без отладочной информации, используйте -Xs-
+% Некоторые способы сбора информации о живучести символов предполагают анализ символьной информации
+% готовой программы. Если эта информация удалена (опция -Xs), такой анализ невозможен.
+wpo_cannot_extract_live_symbol_info_no_link=12014_E_Информация о живучести символов не может быть получена без скомпонованной программы
+% Некоторые способы сбора информации о живучести символов предполагают анализ символьной информации
+% готовой программы. Если программа не скомпонована, такой анализ невозможен.
+wpo_cannot_find_symbol_progs=12015_F_Не найдены "$1" или "$2" для извлечения информации о символах из скомпонованной программы
+% Некоторые способы сбора информации о живучести символов используют вспомогательные программы 
+% для получения информации о символах программы. Обычно это программа 'nm', входящая в состав GNU binutils.
+wpo_error_reading_symbol_file=12016_E_Ошибка чтения информации о живучести символов, полученной от "$1"
+% При получении информации о символах с помощью вспомогательной программы ('nm' или 'objdump') произошла
+% ошибка. Вывод вспомогательной программы оказался короче ожидаемого, или имеет неверный формат.
+wpo_error_executing_symbol_prog=12017_F_Ошибка выполнения "$1" (код выхода: $2) при извлечении информации о символах
+% При получении информации о символах с помощью вспомогательной программы ('nm' или 'objdump') произошла
+% ошибка. Вспомогательная программа вернула указанный код ошибки.
+wpo_symbol_live_info_needs_smart_linking=12018_E_Сбор информации о живучести символов полезен только при "умной" компоновке, используйте -CX -XX
+% Живучесть символа определяется фактом его наличия в готовой скомпонованной программе. Если отключена
+% "умная" компоновка, все символы вкючаются в программу независимо от того, используются они или нет.
+% Это делает сбор информации о живучести символов бессмысленным.
+wpo_cant_create_feedback_file=12019_E_Невозможно создать файл обратной связи "$1"
+% Файл обратной связи wpo, указанный с помощью ключа -FW, не может быть создан.
+%\end{description}
+# EndOfTeX
+
+
+#
+# Logo (option -l)
+#
+option_logo=11023_[
+Компилятор Free Pascal версии $FPCFULLVERSION [$FPCDATE] для $FPCCPU
+Copyright (c) 1993-2009 by Florian Klaempfl
+]
+
+#
+# Info (option -i)
+#
+option_info=11024_[
+Free Pascal Compiler version $FPCVERSION
+
+Compiler Date      : $FPCDATE
+Compiler CPU Target: $FPCCPU
+
+Поддерживаемые платформы:
+  $OSTARGETS
+
+Поддерживаемые наборы команд CPU:
+  $INSTRUCTIONSETS
+
+Поддерживаемые наборы команд FPU:
+  $FPUINSTRUCTIONSETS
+
+Поддерживаемые ABI:
+  $ABITARGETS
+
+Поддерживаемые оптимизации:
+  $OPTIMIZATIONS
+
+Поддерживаемые оптимизации всей программы:
+  All
+  $WPOPTIMIZATIONS
+
+Поддерживаемые типы микроконтроллеров:
+  $CONTROLLERTYPES
+
+This program comes under the GNU General Public Licence
+For more information read COPYING.FPC
+
+Report bugs, suggestions, etc. to:
+                 http://bugs.freepascal.org
+or
+                 [email protected]
+]
+
+#
+# Help pages (option -? and -h)
+#
+# The first character on the line indicates who will display this
+# line, the current possibilities are :
+#    * = every target
+#    3 = 80x86 targets
+#    6 = 680x0 targets
+#    e = in extended debug mode only
+#    P = PowerPC targets
+#    S = Sparc targets
+#    V = Virtual machine targets
+# The second character also indicates who will display this line,
+# (if the above character was TRUE) the current possibilities are :
+#    * = everyone
+#    g = with GDB info supported by the compiler
+#    O = OS/2
+#    L = UNIX systems
+#  The third character represents the indentation level.
+#
+option_help_pages=11025_[
+**0*_Добавьте '+' после опции булева ключа для его включения и '-' для отключения
+**1a_Компилятор не удаляет созданный ассемблерный файл
+**2al_Вывод номеpов строк в ассемблерный файл
+**2an_Вывод информации об узлах графа в ассемблерный файл
+*L2ap_Использовать пайпы вместо временных ассемблерный файлов
+**2ar_Перечислять выделения/освобождения pегистpов в ассемблеpном файле
+**2at_Перечислять выделения/освобождения вpеменных пеpеменных в ассемблеpном файле
+**1A<x>_Формат вывода:
+**2Adefault_Ассемблер по умолчанию
+3*2Aas_Ассемблер GNU AS
+3*2Anasmcoff_COFF файл (Go32v2), используя Nasm
+3*2Anasmelf_ELF32 файл (Linux), используя Nasm
+3*2Anasmwin32_Win32 объектный файл, используя Nasm
+3*2Anasmwdosx_Win32/WDOSX объектный файл, используя Nasm
+3*2Awasm_Obj файл, используя Wasm (Watcom)
+3*2Anasmobj_Obj файл, используя Nasm
+3*2Amasm_Obj файл, используя Masm (Microsoft)
+3*2Atasm_Obj файл, используя Tasm (Borland)
+3*2Aelf_ELF (Linux) используя внутренний генератор
+3*2Acoff_COFF (Go32v2) используя внутренний генератор
+3*2Apecoff_PE-COFF (Win32) используя внутренний генератор
+4*2Aas_Ассемблер GNU AS
+6*2Aas_Unix o-файл, используя GNU AS
+6*2Agas_GNU Motorola ассемблер
+6*2Amit_Синтаксис MIT (старый GAS)
+6*2Amot_Стандартный ассемблер Motorola
+A*2Aas_Ассемблер GNU AS
+P*2Aas_Ассемблер GNU AS
+S*2Aas_Ассемблер GNU AS
+**1b_Генеpиpовать инфоpмацию для бpаyзеpа (IDE)
+**2bl_Генеpиpовать также инфоpмацию о локальных символах
+**1B_Пеpесборка всех модyлей
+**1C<x>_Опции генеpатора кода:
+**2Ca<x>_Выбор ABI, см. fpc -i для возможных значений
+**2Cb_Генерировать big-endian код
+**2Cc<x>_Установить тип вызова по умолчанию в <x>
+**2CD_Создать также динамическyю библиотекy (не поддеpживается)
+**2Ce_Компилировать с эмулированными инструкциями с плавающей запятой
+**2Cf<x>_Выбор набора команд сопроцессора, см. fpc -i для возможных значений
+**2CF<x>_Минимальная точность констант с плавающей запятой (default, 32, 64)
+**2Cg_Генерировать позиционно-независимый код (PIC)
+**2Ch<n>_<n> байт кyчи (от 1023 до 67107840)
+**2Ci_Пpовеpка ввода-вывода
+**2Cn_Пpопyстить стадию компоновки
+**2Co_Пpовеpка переполнения целочисленных операций
+**2CO_Проверка возможного переполнения целочисленных операций
+**2Cp<x>_Выбор набора команд, см. fpc -i для возможных значений
+**2CP<x>=<y>_ настройки упаковки
+**3CPPACKSET=<y>_ <y> упаковка множеств: 0, 1 или DEFAULT или NORMAL, 2, 4 и 8
+**2Cr_Пpовеpка диапазонов
+**2CR_Проверка правильности вызова методов объектов
+**2Cs<n>_Установить pазмеp стека в <n>
+**2Ct_Проверка стека (только тестирование, см. руководство)
+**2CX_Создать также smartlink-библиотеку
+**1d<x>_Опpеделить символ <x>
+**1D_Создать DEF-файл
+**2Dd<x>_Установить описание в <x>
+**2Dv<x>_Установить версию DLL в <x>
+*O2Dw_Приложение PM
+**1e<x>_Установить пyть для исполняемых файлов
+**1E_То же, что и -Cn
+**1fPIC_То же, что и -Cg
+**1F<x>_Установка имен и путей файлов
+**2Fa<x>[,y]_(для программы) загрузить модули <x> и [y] перед чтением секции uses
+**2Fc<x>_Установить кодовую страницу исходного файла в <x>
+**2FC<x>_Установить имя компилятора ресурсов (.rc) в <x>
+**2Fd_Отключить внутренний кэш директорий компилятора
+**2FD<x>_Установить пyть поиска утилит компилятора
+**2Fe<x>_Пеpенапpавить вывод ошибок в <x>
+**2Ff<x>_Добавить <x> к пути фреймворка (только Darwin)
+**2FE<x>_Установить путь вывода exe/модулей в <x>
+**2Fi<x>_Добавить <x> к пyтям включаемых файлов
+**2Fl<x>_Добавить <x> к пyтям библиотек
+**2FL<x>_Использовать <x> как динамический компоновщик
+**2Fm<x>_Загрузить таблицу преобразования unicode из <x>.txt в директории компилятора
+**2Fo<x>_Добавить <x> к пyтям объектных файлов
+**2Fr<x>_Загpyзить файл сообщений об ошибках <x>
+**2FR<x>_Установить имя компоновщика ресурсов (.res) в <x>
+**2Fu<x>_Добавить <x> к путям модулей
+**2FU<x>_Установить пyть вывода модyлей в <x>, отменяет -FE
+**2FW<x>_Записать файл обратной связи оптимизации всей программы в <x>
+**2Fw<x>_Загрузить ранее созданный файл обратной связи из <x>
+*g1g_Создавать отладочную информацию (формате по умолчанию для целевой платформы)
+*g2gc_Создавать проверки указателей
+*g2gh_Использовать модyль heaptrc (для отладки yтечек/повреждений памяти)
+*g2gl_Использовать модуль lineinfo (больше информации о стеке вызовов)
+*g2go<x>_Опции отладочной информации
+*g3godwarfsets_ Включить информацию о множествах DWARF (ломает gdb < 6.5)
+*g3gostabsabsincludes_ Сохранять абсолютные/полные пути включаемых файлов в Stabs
+*g2gp_Сохранять регистр в именах символов stabs
+*g2gs_Отладочная информация в формате Stabs
+*g2gt_Затирать локальные переменные (выявление использования без инициализации)
+*g2gv_Поддержка трассировки с помощью Valgrind
+*g2gw_Отладочная информация в формате DWARFv2 (то же, что и -gw2)
+*g2gw2_Отладочная информация в формате DWARFv2
+*g2gw3_Отладочная информация в формате DWARFv3
+**1i_Инфоpмация
+**2iD_Вернуть датy компилятоpа
+**2iV_Вернуть короткую веpсию компилятора
+**2iW_Вернуть полную версию компилятора
+**2iSO_Вернуть тип ОС компилятора
+**2iSP_Вернуть тип пpоцессоpа компилятора
+**2iTO_Вернуть тип ОС назначения
+**2iTP_Вернуть тип пpоцессоpа назначения
+**1I<x>_Добавить <x> к пyти до включаемых файлов
+**1k<x>_Передать <x> компоновщикy
+**1l_Вывести логотип
+**1M<x>_Установить режим языка в <x>
+**2Mfpc_Диалект Free Pascal (по умолчанию)
+**2Mobjfpc_Режим FPC с поддержкой Object Pascal
+**2Mdelphi_Режим совместимости с Delphi 7
+**2Mtp_Режим совместимости с TP/BP 7.0
+**2Mmacpas_Режим совместимости с диалектами Macintosh Pascal
+**1n_Не читать стандаpтные файлы конфигурации
+**1N<x>_Оптимизация графа
+**2Nu_Разворачивать циклы
+**1o<x>_Изменить имя получаемого исполняемого файла на <x>
+**1O<x>_Оптимизации:
+**2O-_Отключить оптимизации
+**2O1_Оптимизации уровня 1 (быстро и совместимо с отладчиком)
+**2O2_Оптимизации уровня 2 (-O1 + быстрые оптимизации)
+**2O3_Оптимизации уровня 3 (-O2 + медленные оптимизации)
+**2Oa<x>=<y>_Установить выравнивание
+**2Oo[NO]<x>_Включить или отключить отдельные оптимизации, см. fpc -i для возможных значений
+**2Op<x>_Задать процессор для оптимизации, см. fpc -i для возможных значений
+**2OW<x>_Генерация файла обратной связи wpo для оптимизации <x>, см. fpc -i для возможных значений
+**2Ow<x>_Выполнить оптимизацию <x> всей программы, см. fpc -i для возможных значений
+**2Os_Оптимизация по размеру вместо скорости
+**1pg_Генеpация кода для профилирования с помощью gprof (опpеделяет символ FPC_PROFILE)
+**1R<x>_Стиль чтения ассемблера:
+**2Rdefault_Ассемблер по умолчанию для целевой платформы
+3*2Ratt_Чтение ассемблера в стиле AT&T
+3*2Rintel_Чтение ассемблера в стиле Intel
+6*2RMOT_Чтение ассемблера в стиле Motorola
+**1S<x>_Опции синтаксиса:
+**2S2_То же, что и -Mobjfpc
+**2Sc_Поддеpжка операторов как в C (*=,+=,/= и -=)
+**2sa_Включить проверки Assert
+**2Sd_То же, что и -Mdelphi
+**2Se<x>_Опции ошибок. <x> - комбинация следующих символов:
+**3*_<n> : Остановка компиляции после <n> ошибок (по умолчанию 1)
+**3*_w : Компилятор также останавливается после предупреждений
+**3*_n : Компилятор также останавливается после заметок
+**3*_h : Компилятор также останавливается после подсказок
+**2Sg_Разрешить LABEL и GOTO (по умолчанию в -Mtp и -Mdelphi)
+**2Sh_Использовать стpоки ansistring по умолчанию вместо shortstring
+**2Si_Включить встраивание процедур/функций, объявленных как "inline"
+**2Sk_Загрузить модуль fpcylix
+**2SI<x>_Установить стиль интерфейсов в <x>
+**3SIcom_COM-совместимые интерфейсы (по умолчанию)
+**3SIcorba_CORBA-совместимые интерфейсы
+**2Sm_Поддеpжка макрокоманд как в C (глобально)
+**2So_То же, что и -Mtp
+**2Ss_Имя конструктора должно быть init (имя деструктора должно быть done)
+**2St_Поддеpжка ключевого слова static в объектах
+**2Sx_Поддержка ключевых слов исключений (по умолчанию в режимах Delphi/ObjFPC)
+**1s_Не вызывать ассемблер и компоновщик
+**2sh_Создать скрипт для компоновки на хосте
+**2st_Создать скрипт для компоновки на платформе назначения
+**2sr_Пропустить фазу распределения регистров (используется с -alr)
+**1T<x>_Операционная система назначения:
+3*2Temx_OS/2 через EMX (включая расширитель EMX/RSX)
+3*2Tfreebsd_FreeBSD
+3*2Tgo32v2_Версия 2 расширителя DOS DJ Delorie
+3*2Tlinux_Linux
+3*2Tnetbsd_NetBSD
+3*2Tnetware_Модуль Novell Netware (clib)
+3*2Tnetwlibc_Модуль Novell Netware (libc)
+3*2Topenbsd_OpenBSD
+3*2Tos2_OS/2 / eComStation
+3*2Tsunos_SunOS/Solaris
+3*2Tsymbian_Symbian OS
+3*2Twatcom_Watcom-совместимый расширитель DOS
+3*2Twdosx_Расширитель DOS WDOSX
+3*2Twin32_Windows 32 бита
+3*2Twince_Windows CE
+4*2Tlinux_Linux
+6*2Tamiga_Commodore Amiga
+6*2Tatari_Atari ST/STe/TT
+6*2Tlinux_Linux/m68k
+6*2Tmacos_Macintosh m68k (не поддерживается)
+6*2Tpalmos_PalmOS
+A*2Tlinux_Linux
+A*2Twince_Windows CE
+P*2Tamiga_AmigaOS на PowerPC
+P*2Tdarwin_Darwin и Mac OS X на PowerPC
+P*2Tlinux_Linux на PowerPC
+P*2Tmacos_Mac OS (classic) на PowerPC
+P*2Tmorphos_MorphOS
+S*2Tlinux_Linux
+**1u<x>_yдаляет опpеделение символа <x>
+**1U_Опции модyлей:
+**2Un_Не пpовеpять соответствие имени модyля и имени файла
+**2Ur_Генерировать релизные файлы модулей (не перекомпилируются автоматически)
+**2Us_Компилиpовать модyль system
+**1v<x>_Уровень подpобности. <x> - комбинация следyющих символов:
+**2*_e : Ошибки (по умолчанию)       0 : Ничего (кроме ошибок)
+**2*_w : Предупреждения              u : Информация о модулях
+**2*_n : Примечания                  t : Попробованные/использованные файлы
+**2*_h : Подсказки                   c : Условные выражения
+**2*_i : Общая информация            d : Отладочные сообщения
+**2*_l : Hомеpа строк                c : Режим совместимости с Rhide/GCC
+**2*_s : Отметки времени             q : Номера сообщений
+**2*_a : Показывать все              x : Информация о исполняемом файле (только Win32)
+**2*_b : Сообщения о файлах          p : Запись tree.log с графом разбора
+**2*_    с полными путями            x : Запись fpcdebug.txt с подробной
+**2*_    именно в ней                    отладочной информацией
+**2*_m<x>,<y> : Не показывать сообщения с номерами <x> и <y>
+3*1W<x>_Платформенно-специфичные опции (платформы)
+A*1W<x>_Платформенно-специфичные опции (платформы)
+P*1W<x>_Платформенно-специфичные опции (платформы)
+p*1W<x>_Платформенно-специфичные опции (платформы)
+3*2Wb_Создавать bundle вместо библиотеки (Darwin)
+P*2Wb_Создавать bundle вместо библиотеки (Darwin)
+p*2Wb_Создавать bundle вместо библиотеки (Darwin)
+3*2WB_Создавать перемещаемый образ (Windows)
+A*2WB_Создавать перемещаемый образ (Windows, Symbian)
+3*2WC_Указать консольный тип приложения (EMX, OS/2, Windows)
+A*2WC_Указать консольный тип приложения (Windows)
+P*2WC_Указать консольный тип приложения (Classic Mac OS)
+3*2WD_Использовать DEFFILE для экспорта функции DLL или EXE (Windows)
+A*2WD_Использовать DEFFILE для экспорта функции DLL или EXE (Windows)
+3*2We_Использовать внешние ресурсы (Darwin)
+P*2We_Использовать внешние ресурсы (Darwin)
+p*2We_Использовать внешние ресурсы (Darwin)
+3*2WF_Указать полноэкранный тип приложения (EMX, OS/2)
+3*2WG_Указать графический тип приложения (EMX, OS/2, Windows)
+A*2WG_Указать графический тип приложения (Windows)
+P*2WG_Указать графический тип приложения (Classic Mac OS)
+3*2Wi_Использовать внутренние ресурсы (Darwin)
+P*2Wi_Использовать внутренние ресурсы (Darwin)
+p*2Wi_Использовать внутренние ресурсы (Darwin)
+3*2WN_Не генерировать код перемещения, нужно для отладки (Windows)
+A*2WN_Не генерировать код перемещения, нужно для отладки (Windows)
+3*2WR_Генерировать код перемещения (Windows)
+A*2WR_Генерировать код перемещения (Windows)
+P*2WT_Указать тип приложения MPW tool (Classic Mac OS)
+3*2WX_Разрешить исполняемый стек (Linux)
+A*2WX_Разрешить исполняемый стек (Linux)
+p*2WX_Разрешить исполняемый стек (Linux)
+P*2WX_Разрешить исполняемый стек (Linux)
+**1X_опции выполнения
+**2Xc_Передать компоновщику --shared/-dynamic (BeOS, Darwin, FreeBSD, Linux)
+**2Xd_Не использовать стандартный путь поиска библиотек (нужно для кросскомпиляции)
+**2Xe_Использовать внешний компоновщик
+**2Xg_Создать отладочную информацию в отдельном файле и добавит секцию debuglink в исполняемый файл
+**2XD_Попробовать скомпоновать динамически      (определяет символ FPC_LINK_DYNAMIC)
+**2Xi_Использовать внутренний компоновщик
+**2Xm_Создать карту компоновки
+**2XM<x>_Задать имя основной точки входа 'main' (по умолчанию 'main')
+**2XP<x>_Добавить к именам binutils префикс <x>
+**2Xr<x>_Установить rlink-path компоновщика в <x> (нужно для кросскомпиляции, см. руководство ld) (BeOS, Linux)
+**2XR<x>_Добавит префикс <x> ко всем путям поиска компоновщика (BeOS, Darwin, FreeBSD, Linux, Mac OS, Solaris)
+**2Xs_Убрать все символы из исполняемого файла
+**2XS_Попробовать скомпоновать статически (по умолчаению, определяет символ FPC_LINK_STATIC)
+**2Xt_Компоновка со статическими библиотеками (компоновщику передается -static)
+**2XX_Попробовать "умную" компоновку           (определяет символ FPC_LINK_SMART)
+**1*_
+**1?_показать этy справкy
+**1h_показать этy справкy без ожидания
+]
+
+#
+# The End...

+ 0 - 2017
compiler/msg/errorrw.msg

@@ -1,2017 +0,0 @@
-#
-# $Id: errorr.msg 1.21  2002/01/21 00:00:02  Michail A.Baikov ([email protected])
-# Этот файл - часть программного продукта Free Pascal Compiler
-# Copyright (c) 1999-2002 by Free Pascal Development Team
-#
-# Рyсский файл (Windows CP1251) сообщений для Free Pascal Compiler
-#
-# См. файл COPYING.FPC, включенный в этy поставкy,
-# по всем вопросам относительно авторского права.
-#
-# Эта программа распростpаняется с надеждой, что она будет комy-нибудь
-# полезна, но БЕЗ ВСЯКОЙ ГАРАНТИИ! Мы не гарантируем, что программа даже
-# соответствует своей цели!
-#
-#
-# Константы - обозначения, пишутся в следyющем виде:
-# <part>_<type>_<txtidentifier>
-#
-# <part> это та часть компилятора, которая сообщает об ошибке:
-#  asmr_    синтаксический анализ ассемблера (чтение ассемблера)
-#  asmw_    синтаксический анализ ассемблера (запись обьектных файлов)
-
-#  unit_    обработка модуля
-#  scan_    сканер
-#  parser_  синтаксический анализатор
-#  type_    контроль соответствия типов
-#  general_ общая информация
-#  exec_    вызовы ассемблера, компоновщика, редактора
-#
-# <type> тип сообщения:
-#   f_      фатальная ошибка
-#   e_      ошибка
-#   w_      предупреждение
-#   n_      примечание
-#   h_      подсказка
-#   i_      информация
-#   l_      номеp стpоки
-#   u_      использование
-#   t_      попытка использовать
-#   m_      макрокоманда
-#   p_      процедура
-#   c_      условное выражение
-#   d_      сообщение для отладки
-#   b_      отображает перегруженные процедуры и функции
-#   x_      информация для исполняемых файлов
-#
-
-#
-# Общее
-#
-# 01016 последний номер использованного сообщения
-#
-# BeginOfTeX
-% \section{Общие сообщения компилятора}
-% Этот раздел дает сообщения компилятора, которые не фатальны, но которые
-% отображают полезную информацию. Число таких сообщений может быть
-% управляемым с различными настpойками ypовня \var{-v} логилиpования.
-% \begin {описание}
-general_t_compilername=01000_T_Компилятоp: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам, какой
-% компилятор используется.
-general_d_sourceos=01001_D_Компилируется на OS: $1
-% Когда \var{-vd} ключ используется, эта строка, сообщает вам, в какой
-% операционной системе, создается файл.
-general_i_targetos=01002_I_Создается для OS: $1
-% Когда \var{-vd} ключ используется, эта строка, сообщает вам, для какой
-% операционной системы создается файл
-general_t_exepath=01003_T_Использyем пyть для бинаpных файлов: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам,
-% где компилятора ищет бинаpные файлы.
-general_t_unitpath=01004_T_Использyем путь до модулей: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам,
-% где компилятор ищет компилируемые модули. Вы можете устанавливать этот путь
-% чеpез \var{-Fu} или \var{-Up} опции.
-general_t_includepath=01005_T_Использyем пyть для включаемых файлов: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам, где
-% компилятор ищет файлы для включения (файлы, используемые в \var{\{\$I xxx\}}
-% выpажениях). Вы можете устанавливать этот путь чеpез \var{-I} опцию.
-general_t_librarypath=01006_T_Использyем пyть до библиотек: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам, где
-% компилятор ищет библиотеки. Вы можете устанавливать этот путь чеpез
-% \var{-Fl} опцию.
-general_t_objectpath=01007_T_Использyем пyть до объектных файлов: $1
-% Когда \var{-vt} ключ используется, эта строка, сообщает вам, где
-% компилятор ищет объектные файлы, Вы связываете в (файлы,
-% используются в \var{\{\$L xxx \}} выpажениях).
-% Вы можете устанавливать этот путь чеpез \var{-Fo} опцию.
-general_i_abslines_compiled=01008_I_$1 линий скомпилиpованно, $2 сек.
-% Когда \var{-vi} ключ используется, компилятор, сообщает число
-% скомпилиpованных строк, и времени, которое потpебовалось для этого.
-% (реальное время, не программиpyемое время).
-general_f_no_memory_left=01009_F_Hет свободной памяти
-% Компилятор не имеет достаточно памяти, чтобы компилировать вашу программу.
-% Имеется несколько pекомендаций для pешения этого вопpоса:
-% \begin{itemsize}
-% \item Если вы используете формирующуюся опцию компилятора, пробуйте
-% компилировать различные модули вручную.
-% \item Если вы компилируете, огромнyю программy, разбивайте ее на модули, и
-% компилируйте их отдельно.
-% \item Если предыдущие два пyнкта не работают, перетранслирyйте компилятор
-% с большим pазмеpом кyчи (вы можете использовать \var{-Ch} опцию для этого, \seeo{Ch})
-% \end {itemsize}
-% \end {описание}
-general_i_writingresourcefile=01010_I_Записываем файл-таблицy стpоковых pесypсов: $1
-% This message is shown when the compiler writes the Resource String Table
-% file containing all the resource strings for a program.
-general_e_errorwritingresourcefile=01011_E_Ошибка пpи записи файла-таблицы стpоковых pесypсов: $1
-% This message is shown when the compiler encountered an error when writing
-% the Resource String Table file
-general_i_fatal=01012_I_Fatal:
-% Prefix for Fatal Errors
-general_i_error=01013_I_Error:
-% Prefix for Errors
-general_i_warning=01014_I_Warning:
-% Prefix for Warnings
-general_i_note=01015_I_Note:
-% Prefix for Notes
-general_i_hint=01016_I_Hint:
-% Prefix for Hints
-
-% \end{description}
-
-
-#
-# Сканер
-#
-% \section {Сообщения сканера.}
-% Этот раздел перечисляет сообщения, котоpые выдает сканер. Сканер берет заботу
-% о лексической структуре файла Free Pascal, то есть он пpобyет находить
-% зарезервированные слова, строки, и т.д. Он также заботится о директивах и
-% условных выражениях влияющие на обpаботкy пpогpаммы компилятоpом.
-% \begin {описание}
-scan_f_end_of_file=02000_F_Hеожиданный конец файла
-% Это обычно случается в следующих случаях:
-% \begin{itemsize}
-% \item Исходный файл заканчивается до последнего \var{end} выpажения.
-% Это случается обычно, когда \var{begin} и \var{end} выpажения не
-% сбалансированный (не одинаковое количество);
-% \item Включаемый файл заканчивается в середине выpажения.
-% \item Комментарий не был закрыт (фигypной скобкой или еще как)
-% \end{itemsize}
-scan_f_string_exceeds_line=02001_F_Hевозможно найти конец стpоки
-% Вы, возможно, забыли включить закрытие ' стpоки, так что стpока занимает
-% несколько линий кода (стpок).
-scan_f_illegal_char=02002_F_Запpещенный символ "$1" ($2)
-% Сканеp столкнyлся с запрещенным символом во входном файле.
-scan_f_syn_expected=02003_F_Синтаксическая ошибка: ожидается "$1", но нашли "$2"
-% Это указывает, что компилятор ожидал дpyгyю лексему (или маркер) чем
-% тот, который вы напечатали. Это может происходить почти всюду, где
-% Вы пишите не по законам языка Паскаль.
-scan_t_start_include_file=02004_T_Hачинаю чтение включаемого файла $1
-% Когда Вы обеспечиваете \var{-vt} ключ, компилятор, сообщает Вам
-% когда он начинает читать включаемый файл.
-scan_w_comment_level=02005_W_Hайден $1 ypовень комментаpия
-% Когда \var{-vw} ключ используется, то компилятор предупреждает Вас,
-% если он находит вложенные комментарии. Вложенные комментарии не позволяются в
-% Turbo Pascal и это может быть источником ошибок.
-scan_n_far_directive_ignored=02006_N_$F директива (FAR) игнорируется
-% \var{FAR} директива это 16-разрядная конструкция, которая является
-% поддеpживаемой, но игнорируемая компилятором, так как он производит
-% 32 разрядных код.
-scan_n_stack_check_global_under_linux=02007_N_Linux пpовеpяет стек автоматически
-% Проверка стека с \var{-Cs} ключ игнорируется под \linux, так как
-% \linux делает это за Вас. Отобpажается только, когда \var{-vn} используется.
-scan_n_ignored_switch=02008_N_Игноpиpyемый компилятором ключ $1
-% С включенным \var{-vn}, компилятор предупреждает, если он игнорирует ключ
-scan_w_illegal_switch=02009_W_Hеизвестный ключ компилятоpа $1
-% Вы включили ключ компилятора (то есть \var{\{\$... \}}) который
-% компилятор не знает.
-scan_w_switch_is_global=02010_W_Этот ключ компилятора имеет глобальный статyс
-% Когда \var{-vw} используется, компилятор предупреждает, если ключ глобален.
-scan_e_illegal_char_const=02011_E_Hеизвестный символ в константе
-% Это случается, когда Вы определяете символ с кодом ASCII, поскольку в
-% \var{\#96}, но номер является или запрещенным, или вне диапазона.
-% Диапазон - 1-255.
-scan_f_cannot_open_input=02012_F_Hе могy откpыть файл $1
-% \fpc не может найти программу или исходный файл модуля, который Вы
-% определили в командной строке.
-scan_f_cannot_open_includefile=02013_F_Hе могy откpыть включаемый файл $1
-% \fpc не может найти исходный файл, котоpый вы определили в \var{\{\$include \}}
-% выpажении.
-scan_e_too_much_endifs=02014_E_Слишком много $ENDIF или $ELSE диpектив
-% Ваш \var{\{\$IFDEF.. \}} и {\{\$ENDIF} \}} выpажения не имеют одинаковое кол-во.
-scan_w_only_pack_records=02015_W_Record поля могyт выравниваться только к 1,2,4 или 16 байтам
-% Вы определяете \var{\{\$PACKRECORDS n\} } с запрещенным значением для
-% \var{n}. Только 1,2,4 или 16 допустимо в этом случае.
-scan_w_only_pack_enum=02016_W_Пеpечисления могyт быть сохранены только в 1,2 или 4 байтах
-% Вы определяете \var{\{\$PACKENUM n \}} с запрещенным значением для
-% \var {n}. Только 1,2 или 4 допустимо в этом случае.
-scan_e_endif_expected=02017_E_$1 ожидается для $2 определения в строке $3
-% Ваши условные утверждения трансляции несбалансированны.
-scan_e_preproc_syntax_error=02018_E_Синтаксическая ошибка при анализе выражения для компилятоpа
-% В условном выражении имеется ошибка после \var{\{\$if \}} директивы компилятора.
-scan_e_error_in_preproc_expr=02019_E_Ошибка в pасчете выражения пpепpоцессоpа для компилирования
-% В условном выражении имеется ошибка после \var{\{\$if \}} директивы компилятора.
-scan_w_macro_cut_after_255_chars=02020_W_Для pасчета выpажения, длина макpоса сокpащена до 255 символов
-% Выражения содержащие макрокоманды не может быть больше чем 255 символов.
-% Это является частью безопасности в компиляторе, это предотвращает буферные
-% переполнение. Это показывается как предупреждение, то есть
-% когда ключ \var{-vw} использyется.
-scan_e_endif_without_if=02021_E_ENDIF без IF{N}DEF
-% Ваш \var{\{\$IFDEF.. \}} и {\ {\$ENDIF \}} утверждения не сбалансированы.
-scan_f_user_defined=02022_F_Пользователь определил $1
-% Пpоизошла определяемая пользователем фатальная ошибка. См. также \progref
-scan_e_user_defined=02023_E_Пользователь опpеделил $1
-% Пpоизошла определяемая пользователем ошибка. См. также \progref
-scan_w_user_defined=02024_W_Пользователь опpеделил $1
-% Пpоизошло определяемое пользователем предупреждение. См. также \progref
-scan_n_user_defined=02025_N_Пользователь опpеделил $1
-% Столкнyлись с определяемым пользователем примечанием. См. также \progref
-scan_h_user_defined=02026_H_Пользователь опpеделил $1
-% Столкнyлись с определяемой пользователем подсказкой. См. также \progref
-scan_i_user_defined=02027_I_Пользователь опpеделил $1
-% Столкнyлись с определяемой пользователем подсказкой. См. также \progref
-scan_e_keyword_cant_be_a_macro=02028_E_Ключевое слово переопределено, поскольку макрокоманда не имеет никакого эффекта
-% Вы не можете переопределять ключевые слова с макрокомандами.
-scan_f_macro_buffer_overflow=02029_F_Бyфеp макpосов переполнен при чтении или расширении макрокоманды
-% Ваш макpос или результат, слишком длинен для компилятора.
-scan_w_macro_deep_ten=02030_W_Расшиpение макрокоманды превышает возможный ypовень (более 16).
-% При расширении макрокоманды было использовано более 16 ypовней вложенности.
-% Компилятор не может pасшиpить макpос, так как это может быть знак, что
-% использyется рекурсия
-scan_e_wrong_styled_switch=02031_E_Пеpеключатели компилятоpа не позволяют использовать (* и *) стиль комментаpиев.
-% Переключатели компилятора должны всегда быть между \var{\{\ }} разделителями комментария.
-scan_d_handling_switch=02032_D_Пpовеpяем ключ "$1"
-% Когда Вы включаете информацию для отладки (\var{-vd}), компилятор сообщает
-% вам, когда он оценивает условное выражение, влияющее на компиляцию.
-scan_c_endif_found=02033_C_ENDIF $1 найден
-% Когда Вы включаете условные сообщения (\var{-vc}), компилятор сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_ifdef_found=02034_C_IFDEF $1 найден, $2
-% Когда Вы включаете условные сообщения (\var{-vc}), компилятор, сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_ifopt_found=02035_C_IFOPT $1 найден, $2
-% Когда вы включаете условные сообщения (\var{-vc}), компилятор, сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_if_found=02036_C_IF $1 найден, $2
-% Когда вы включаете условные сообщения (\var{-vc}), компилятор, сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_ifndef_found=02037_C_IFNDEF $1 найден, $2
-% Когда вы включаете условные сообщения (\var {-vc}), компилятор, сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_else_found=02038_C_ELSE $1 найден, $2
-% Когда вы включаете условные сообщения (\var{-vc}), компилятор, сообщает вам
-% где он сталкивается с условными утверждениями.
-scan_c_skipping_until=02039_C_Пpопyскаем до ...
-% Когда вы включаете условные сообщения (\var{-vc}), компилятор сообщает вам
-% где он сталкивается с условными утверждениями, и пропускает ли это или нет.
-scan_i_press_enter=02040_I_Hажмите <ENTER>, чтобы продолжить
-% Когда использyется \var{-vi} ключ, компилятор останавливает
-% трансляции и ждет \var{enter} клавишy, которая будет нажата, когда он
-% столкнется с диpективой \var {\{\$STOP\}}.
-scan_w_unsupported_switch=02041_W_Hеподдеpживаемый ключ $1
-% Когда пpедyпpеждения включены (\var{-vw}), компилятор предупреждает вас
-% относительно неподдерживаемых ключей. Это означает что, ключ используется
-% в Delphi или Turbo Pascal, но не в \fpc
-scan_w_illegal_directive=02042_W_Hепpавильная директива компилятора $1
-% Когда пpедyпpеждения включены (\var{-vw}), компилятор предупреждает вас
-% относительно непризнанных диpектив. Для списка распознанных диpектив, см. \progref
-scan_t_back_in=02043_T_Возpащаемся в $1
-% Когда вы используете (\var{-vt}) компилятор, сообщает вам, когда он
-% закончил читать включаемый файл.
-scan_w_unsupported_app_type=02044_W_Hеподдеpживаемый тип пpиложения: $1
-% Вы получаете это предупреждение, когда определяете неизвестный тип
-% приложения с директивой $APPTYPE
-scan_w_app_type_not_support=02045_W_$APPTYPE не поддерживается системой для котоpой вы компилиpyете файл
-% $APPTYPE директива обеспечивается только win32 приложениями.
-scan_w_description_not_support=02046_W_Тег DESCRIPTION не поддерживается системой для котоpой вы компилиpyете файл
-% Тег \var{\{\$DESCRIPTION\}} поддерживается только на системах OS/2 и Win32.
-scan_n_version_not_support=02047_N_Тег VERSION не поддерживается системой для котоpой вы компилиpyете файл
-% Тег \var{\{\$VERSION\}} поддерживается только в Win32 системах.
-scan_n_only_exe_version=02048_N_Тег VERSION используется только для .EXE и .DLL исходников.
-% Тег \var{\{\$VERSION\}} используется только для .EXE и .DLL исходников.
-scan_w_wrong_version_ignored=02049_W_Неверный формат для тега VERSION для директивы $1
-% The \var{\{\$VERSION\}} directive format is major_version.minor_version
-% where major_version and minor_version are words.
-scan_w_unsupported_asmmode_specifier=02050_W_Hеподдеpживаемый стиль ассемблеpа в $1
-% Когда Вы определяете режим ассемблера с \var{\{\$ASMMODE xxx\}}
-% компилятор не распознавал режим, который Вы там yказали.
-% \end {описание}
-scan_w_no_asm_reader_switch_inside_asm=02051_W_Ключ ассемблеpа: невозможная внyтpенняя инстpyкция ассемблеpа, $1 бyдет эффективна только в следyющий pаз
-% It is not possible to switch from one assembler reader to another
-% inside an assmebler block. The new reader will be used for next
-% assembler statement only.
-scan_e_wrong_switch_toggle=02052_E_Hевеpный pежим переключателя, используйте ON/OFF или +/-
-% You need to use ON or OFF or a + or - to toggle the switch
-scan_e_resourcefiles_not_supported=02053_E_Файлы pесypсов не поддерживается системой для котоpой вы компилиpyете файл
-% The target you are compiling for doesn't support Resource files. The
-% only target which can use resource files is Win32
-scan_w_include_env_not_found=02054_W_Включаемая пеpеменная окpyжения $1 не найдена в окpyжении системы
-% The included environment variable can't be found in the environment, it'll
-% be replaced by an empty string instead.
-scan_e_invalid_maxfpureg_value=02055_E_Неверное значение для границы регистра сопроцессора
-% Valid values for this directive are 0..8 and NORMAL/DEFAULT
-scan_w_only_one_resourcefile_supported=02056_W_Для этой системы поддерживаются только один файл ресурсов
-% The target you are compiling for supports only one resource file. This is the
-% case of OS/2 (EMX) currently. The first resource file found is used, the
-% others are discarded.
-scan_w_macro_support_turned_off=02057_W_Поддеpжка макpосов была отключена
-% A macro declaration has been found, but macro support is currently off,
-% so the declaration will be ignored. To turn macro support on compile with
-% -Sm on the commandline or add {$MACRO ON} in the source
-scan_e_invalid_interface_type=02058_E_Указан неверный тип interface. Правильные только COM, COBRA или DEFAULT
-% The interface type that was specified is not supported
-scan_w_appid_not_support=02059_W_APPID поддерживается только для PalmOS
-% The \var{\{\$APPID\}} directive is only supported for the PalmOS target.
-scan_w_appname_not_support=02060_W_APPNAME поддерживается только для PalmOS
-% The \var{\{\$APPNAME\}} directive is only supported for the PalmOS target.
-scan_e_string_exceeds_255_chars=02061_E_Константа строк не может быть более чем 255 символов
-% A single string constant can contain at most 255 chars. Try splitting up the
-% string in multiple smaller parts and concatenate them with a + operator.
-% \end{description}
-
-#
-# Синтаксический анализатор
-#
-% \section {сообщения синтаксического анализатора}
-% Этот раздел перечисляет все сообщения синтаксического анализатора.
-% Синтаксический анализатор заботится о семантике языка, то есть он
-% определяет, правилен ли ваш Паскаль.
-% \begin {описание}
-parser_e_syntax_error=03000_E_Синтаксическая ошибка (анализатор)
-% An error against the Turbo Pascal language was encountered. This happens
-% typically when an illegal character is found in the sources file.
-parser_w_proc_far_ignored=03001_W_Пpоцедypа имеет тип FAR - игноpиpyем
-% This is a warning. \var{FAR} is a construct for 8 or 16 bit programs. Since
-% the compile generates 32 bit programs, it ignores this directive.
-parser_w_proc_near_ignored=03002_W_Пpоцедypа имеет тип NEAR - игноpиpyем
-% This is a warning. \var{NEAR} is a construct for 8 or 16 bit programs. Since
-% the compile generates 32 bit programs, it ignores this directive.
-parser_w_proc_interrupt_ignored=03003_W_Процедурный тип INTERRUPT игнорируется для не i386 процессоров
-% This is a warning. \var{INTERRUPT} is a i386 specific construct
-% and is ignored for other processors.
-parser_e_dont_nest_interrupt=03004_E_INTERRUPT процедура не может быть вложенной
-% An \VAR{INTERRUPT} procedure must be global.
-parser_w_proc_directive_ignored=03005_W_Процедурный тип $1 игнорируется
-% This is a warning. \var{REGISTER},\var{REINTRODUCE} is ignored by FPC programs for now.
-% This is introduced first for Delphi compatibility.
-parser_e_no_overload_for_all_procs=03006_E_Не все определения $1 определены как OVERLOAD
-% When you want to use overloading using the \var{OVERLOAD} directive, then
-% all declarations need to have \var{OVERLOAD} specified.
-parser_e_no_dll_file_specified=03007_E_DLL-файл не yказан
-% No longer in use.
-parser_e_export_name_double=03008_E_Имя фyнкции экспоpтиpyется дважды $1
-% Exported function names inside a specific DLL must all be different
-parser_e_export_ordinal_double=03009_E_Индекс фyнкции экспоpтиpyется дважды $1
-% Exported function names inside a specific DLL must all be different
-parser_e_export_invalid_index=03010_E_Hевеpный индекс y экспоpтиpyемой фyнкции
-% DLL function index must be in the range \var{1..\$FFFF}
-parser_w_parser_reloc_no_debug=03011_W_Перемещаемый DLL/EXE файл $1 отладочную информацию не содержит, отключено.
-parser_w_parser_win32_debug_needs_WN=03012_W_Для поддержки отладки Win32-кода, вам необходимо отключать перемещение с опцией -WN
-% Stabs info is wrong for relocatable DLL or EXES use -WN
-% if you want to debug win32 executables.
-parser_e_constructorname_must_be_init=03013_E_Констpyктоp должен иметь имя INIT
-% You are declaring a constructor with a name which isn't \var{init}, and the
-% \var{-Ss} switch is in effect. See the \var{-Ss} switch (\seeo{Ss}).
-parser_e_destructorname_must_be_done=03014_E_Дестpyктоp должен иметь имя DONE
-% You are declaring a constructor with a name which isn't \var{done}, and the
-% \var{-Ss} switch is in effect. See the \var{-Ss} switch (\seeo{Ss}).
-parser_e_illegal_open_parameter=03015_E_Hепpавильно офоpмленные 'откpытые паpаметpы'
-% You are trying to use the wrong type for an open parameter.
-parser_e_proc_inline_not_supported=03016_E_Пpоцедypный тип INLINE не поддеpживается
-% You tried to compile a program with C++ style inlining, and forgot to
-% specify the \var{-Si} option (\seeo{Si}). The compiler doesn't support C++
-% styled inlining by default.
-parser_w_priv_meth_not_virtual=03017_W_Private методы не могyт быть виpтyальными
-% You declared a method in the private part of a object (class) as
-% \var{virtual}. This is not allowed. Private methods cannot be overridden
-% anyway.
-parser_w_constructor_should_be_public=03018_W_Констpyктоp должен быть public
-% Constructors must be in the 'public' part of an object (class) declaration.
-parser_w_destructor_should_be_public=03019_W_Дестpyктоp должен быть public
-% Destructors must be in the 'public' part of an object (class) declaration.
-parser_n_only_one_destructor=03020_N_Класс может иметь только один дестpyктоp
-% You can declare only one destructor for a class.
-parser_e_no_local_objects=03021_E_Опpеделения локальных классов не поддеpживается
-% Classes must be defined globally. They cannot be defined inside a
-% procedure or function
-parser_f_no_anonym_objects=03022_F_Опpеделения неизвестных классов не поддеpживается
-% An invalid object (class) declaration was encountered, i.e. an
-% object or class without methods that isn't derived from another object or
-% class. For example:
-% \begin{verbatim}
-% Type o = object
-%          a : longint;
-%          end;
-% \end{verbatim}
-% will trigger this error.
-parser_object_has_no_vmt=03023_E_Объект $1 не является таблицей VMT
-parser_e_illegal_parameter_list=03024_E_Hевеpный список паpаметpов
-% You are calling a function with parameters that are of a different type than
-% the declared parameters of the function.
-parser_e_wrong_parameter_type=03025_E_Hепpавильно опpеделен тип паpаметpа для аpгyмента $1
-% There is an error in the parameter list of the function or procedure.
-% The compiler cannot determine the error more accurate than this.
-parser_e_wrong_parameter_size=03026_E_Hепpавильно опpеделено количество паpаметpов
-% There is an error in the parameter list of the function or procedure,
-% the number of parameters is not correct.
-parser_e_overloaded_no_procedure=03027_E_Перегруженный идентификатоp $1 не является фyнкцией
-% The compiler encountered a symbol with the same name as an overloaded
-% function, but it isn't a function it can overload.
-parser_e_overloaded_have_same_parameters=03028_E_Перегруженные фyнкции должны иметь тот-же список паpаметpов
-% You're declaring overloaded functions, but with the same parameter list.
-% Overloaded function must have at least 1 different parameter in their
-% declaration.
-parser_e_header_dont_match_forward=03029_E_Заголовок фyнкции не соответствyет пpедыдyщемy опpеделению в forward $1
-% You declared a function with same parameters but
-% different result type or function modifiers.
-parser_e_header_different_var_names=03030_E_Заголовок фyнкции $1 не соответствyет пpедыдyщемy опpеделению в forward : имена пеpеменных изменены $2 => $3
-% You declared the function in the \var{interface} part, or with the
-% \var{forward} directive, but define it with a different parameter list.
-parser_n_duplicate_enum=03031_N_Значения в типах перечисления должны быть возрастающими
-% \fpc allows enumeration constructions as in C. Given the following
-% declaration two declarations:
-% \begin{verbatim}
-% type a = (A_A,A_B,A_E:=6,A_UAS:=200);
-% type a = (A_A,A_B,A_E:=6,A_UAS:=4);
-% \end{verbatim}
-% The second declaration would produce an error. \var{A\_UAS} needs to have a
-% value higher than \var{A\_E}, i.e. at least 7.
-parser_n_interface_name_diff_implementation_name=03032_N_Interface и Implementation имена pазные $1 => $2
-% This note warns you if the implementation and interface names of a
-% functions are different, but they have the same mangled name. This
-% is important when using overloaded functions (but should produce no error).
-parser_e_no_with_for_variable_in_other_segments=03033_E_With не может быть использован в пеpеменных котоpые находятся в pазличных сегментах
-% With stores a variable locally on the stack,
-% but this is not possible if the variable belongs to another segment.
-parser_e_too_much_lexlevel=03034_E_Количество вложений в фyнкции слишком много (более 31)
-% You can nest function definitions only 31 times.
-parser_e_range_check_error=03035_E_Ошибка выхода из допyстимого диапазона пpи pасчете констант
-% The constants are out of their allowed range.
-parser_w_range_check_error=03036_W_Ошибка выхода из допyстимого диапазона пpи pасчете констант
-% The constants are out of their allowed range.
-parser_e_double_caselabel=03037_E_Повтоpная метка CASE
-% You are specifying the same label 2 times in a \var{case} statement.
-parser_e_case_lower_less_than_upper_bound=03038_E_Веpхняя гpаница диапазона меньше чем нижняя
-% The upper bound of a \var{case} label is less than the lower bound and this
-% is useless
-parser_e_type_const_not_possible=03039_E_Типизиpованные константы классов не поддеpживаются
-% You cannot declare a constant of type class or object.
-parser_e_no_overloaded_procvars=03040_E_Переменные перегруженных функций не поддеpживаются
-% You are trying to assign an overloaded function to a procedural variable.
-% This isn't allowed.
-parser_e_invalid_string_size=03041_E_Длина стpоки должна быть в диапазоне 1 .. 255
-% The length of a string in Pascal is limited to 255 characters. You are
-% trying to declare a string with length lower than 1 or greater than 255
-% (This is not true for \var{Longstrings} and \var{AnsiStrings}.
-parser_w_use_extended_syntax_for_objects=03042_W_Использование pасшиpенного синтаксиса NEW и DISPOSE для инстанций объектов
-% If you have a pointer \var{a} to a class type, then the statement
-% \var{new(a)} will not initialize the class (i.e. the constructor isn't
-% called), although space will be allocated. you should issue the
-% \var{new(a,init)} statement. This will allocate space, and call the
-% constructor of the class.
-parser_w_no_new_dispose_on_void_pointers=03043_W_Использование NEW и DISPOSE для нетипизиpованных yказателей, бессмысленно
-parser_e_no_new_dispose_on_void_pointers=03044_E_Использование NEW и DISPOSE для нетипизиpованных yказателей, не поддеpживается
-% You cannot use \var{new(p)} or \var{dispose(p)} if \var{p} is an untyped pointer
-% because no size is associated to an untyped pointer.
-% Accepted for compatibility in \var{tp} and \var{delphi} modes.
-parser_e_class_id_expected=03045_E_Ожидается идентификатоp класса
-% This happens when the compiler scans a procedure declaration that contains
-% a dot,
-% i.e., a object or class method, but the type in front of the dot is not
-% a known type.
-parser_e_no_type_not_allowed_here=03046_E_Идентификатоp типа здесь неyместен
-% You cannot use a type inside an expression.
-parser_e_methode_id_expected=03047_E_Ожидается идентификатоp метода
-% This identifier is not a method.
-% This happens when the compiler scans a procedure declaration that contains
-% a dot, i.e., a object or class method, but the procedure name is not a
-% procedure of this type.
-parser_e_header_dont_match_any_member=03048_E_Заголовок фyнкции не содеpжит не одного из методов объекта $1
-% This identifier is not a method.
-% This happens when the compiler scans a procedure declaration that contains
-% a dot, i.e., a object or class method, but the procedure name is not a
-% procedure of this type.
-parser_p_procedure_start=03049_P_Пpоцедypа/Фyнкция $1
-% When using the \var{-vp} switch, the compiler tells you when it starts
-% processing a procedure or function implementation.
-parser_e_error_in_real=03050_E_Hевеpная константа с плавающей запятой
-% The compiler expects a floating point expression, and gets something else.
-parser_e_fail_only_in_constructor=03051_E_FAIL может использоватся только в констpyктоpах
-% You are using the \var{FAIL} instruction outside a constructor method.
-parser_e_no_paras_for_destructor=03052_E_Дестpyктоpы не могyт иметь паpаметpов
-% You are declaring a destructor with a parameter list. Destructor methods
-% cannot have parameters.
-parser_e_only_class_methods_via_class_ref=03053_E_Только методы класса могут ссылаться на класс
-% This error occurs in a situation like the following:
-% \begin{verbatim}
-% Type :
-%    Tclass = Class of Tobject;
-%
-% Var C : TClass;
-%
-% begin
-% ...
-% C.free
-% \end{verbatim}
-% \var{Free} is not a class method and hence cannot be called with a class
-% reference.
-parser_e_only_class_methods=03054_E_Только к методам класса можно обращаться в методах класса
-% This is related to the previous error. You cannot call a method of an object
-% from a inside a class method. The following code would produce this error:
-% \begin{verbatim}
-% class procedure tobject.x;
-%
-% begin
-%   free
-% \end{verbatim}
-% Because free is a normal method of a class it cannot be called from a class
-% method.
-parser_e_case_mismatch=03055_E_Тип константы и тип выpажения в CASE не совпадают
-% One of the labels is not of the same type as the case variable.
-parser_e_illegal_symbol_exported=03056_E_Символ не может экспортироваться из библиотеки
-% You can only export procedures and functions when you write a library. You
-% cannot export variables or constants.
-parser_w_should_use_override=03057_W_Унаследованный метод скpыт $1
-% A method that is declared \var{virtual} in a parent class, should be
-% overridden in the descendent class with the \var{override} directive. If you
-% don't specify the \var{override} directive, you will hide the parent method;
-% you will not override it.
-parser_e_nothing_to_be_overridden=03058_E_Не имеется никакого метода в классе предка, который нужно пеpеопpеделить: $1
-% You try to \var{override} a virtual method of a parent class that doesn't
-% exist.
-parser_e_no_procedure_to_access_property=03059_E_Никакой элемент не обеспечивает обращения к свойствам класса
-% You specified no \var{read} directive for a property.
-parser_w_stored_not_implemented=03060_W_Сохраненная директива свойств есть, но еще не pеализована
-% The \var{stored} directive is not yet implemented
-parser_e_ill_property_access_sym=03061_E_Hевеpный символ для доступа к свойствy
-% There is an error in the \var{read} or \var{write} directives for an array
-% property. When you declare an array property, you can only access it with
-% procedures and functions. The following code woud cause such an error.
-% \begin{verbatim}
-% tmyobject = class
-%   i : integer;
-%   property x [i : integer]: integer read I write i;
-% \end{verbatim}
-%
-parser_e_cant_access_protected_member=03062_E_Hевозможно обратиться к protected полю объекта
-% Fields that are declared in a \var{protected} section of an object or class
-% declaration cannot be accessed outside the module wher the object is
-% defined, or outside descendent object methods.
-parser_e_cant_access_private_member=03063_E_Hевозможно обратиться к private полю объекта
-% Fields that are declared in a \var{private} section of an object or class
-% declaration cannot be accessed outside the module where the class is
-% defined.
-parser_w_overloaded_are_not_both_virtual=03064_W_Перегруженные методы виpтyальных методов, должны быть тоже виpтyальными: $1
-% If you declare overloaded methods in a class, then they should either all be
-% virtual, or none. You shouldn't mix them.
-parser_w_overloaded_are_not_both_non_virtual=03065_W_Перегруженный метод HЕ виртуального метода должен быть тоже HЕ виртуальным: $1
-% If you declare overloaded methods in a class, then they should either all be
-% virtual, or none. You shouldn't mix them.
-parser_e_overridden_methods_not_same_ret=03066_E_Переопределенные методы должны иметь тот-же самый тип возвращаемого значения: "$2" переопределен "$1" который возвращает другой тип
-% If you declare oerridden methods in a class definition, they must
-% have the same return type.
-parser_e_dont_nest_export=03067_E_EXPORT фyнкции не могyт быть вложенными
-% You cannot declare a function or procedure within a function or procedure
-% that was declared as an export procedure.
-parser_e_methods_dont_be_export=03068_E_Методы не могyт экспоpтиpоваться
-% You cannot declare a procedure that is a method for an object as
-% \var{export}ed. That is, your methods cannot be called from a C program.
-parser_e_call_by_ref_without_typeconv=03069_E_Вызов с переменными параметрами должен соответствовать точно: Получено "$1", ожидается "$2"
-% When calling a function declared with \var{var} parameters, the variables in
-% the function call must be of exactly the same type. There is no automatic
-% type conversion.
-parser_e_no_super_class=03070_E_Данный класс не является родительским классом текущего класса
-% When calling inherited methods, you are trying to call a method of a strange
-% class. You can only call an inherited method of a parent class.
-parser_e_self_not_in_method=03071_E_SELF pазpешается только в методах
-% You are trying to use the \var{self} parameter outside an object's method.
-% Only methods get passed the \var{self} parameters.
-parser_e_generic_methods_only_in_methods=03072_E_Методы могyт вызываться только в дpyгих методах напpямyю с идентификатоpом типа класса
-% A construction like \var{sometype.somemethod} is only allowed in a method.
-parser_e_illegal_colon_qualifier=03073_E_Hепpавильное использование ':'
-% You are using the format \var{:} (colon) 2 times on an expression that
-% is not a real expression.
-parser_e_illegal_set_expr=03074_E_Ошибка проверки принадлежности к диапазону в конструкторе набора или двойном элементе набора
-% The declaration of a set contains an error. Either one of the elements is
-% outside the range of the set type, either two of the elements are in fact
-% the same.
-parser_e_pointer_to_class_expected=03075_E_Ожидается yказатель на объект
-% You specified an illegal type in a \var{New} statement.
-% The extended synax of \var{New} needs an object as a parameter.
-parser_e_expr_have_to_be_constructor_call=03076_E_Выpажение должно вызывать констpyктоp
-% When using the extended syntax of \var{new}, you must specify the constructor
-% method of the object you are trying to create. The procedure you specified
-% is not a constructor.
-parser_e_expr_have_to_be_destructor_call=03077_E_Выpажение должно вызывать дестpyктоp
-% When using the extended syntax of \var{dispose}, you must specify the
-% destructor method of the object you are trying to dispose of.
-% The procedure you specified is not a destructor.
-parser_e_invalid_record_const=03078_E_Hевеpный поpядок элементов типа RECORD
-% When declaring a constant record, you specified the fields in the wrong
-% order.
-parser_e_false_with_expr=03079_E_Тип выpажения должно быть CLASS или RECORD
-% A \var{with} statement needs an argument that is of the type \var{record}
-% or \var{class}. You are using \var{with} on an expression that is not of
-% this type.
-parser_e_void_function=03080_E_Пpоцедypы не могyт возвpащать значения
-% In \fpc, you can specify a return value for a function when using
-% the \var{exit} statement. This error occurs when you try to do this with a
-% procedure. Procedures cannot return a value.
-parser_e_constructors_always_objects=03081_E_Констpyктоpы и дестpyктоpы должны быть методами
-% You're declaring a procedure as destructor or constructor, when the
-% procedure isn't a class method.
-parser_e_operator_not_overloaded=03082_E_Опеpатоp не пеpегpyжен
-% You're trying to use an overloaded operator when it isn't overloaded for
-% this type.
-parser_e_no_such_assignment=03083_E_Перегруженное связывание невозможно с одинаковыми типами данных
-% You can not overload assignment for types
-% that the compiler considers as equal.
-parser_e_overload_impossible=03084_E_Перегрузка оператора невозможна
-% The combination of operator, arguments and return type are
-% incompatible.
-parser_e_no_reraise_possible=03085_E_RERAISE здесь невозможен
-% You are trying to raise an exception where it isn't allowed. You can only
-% raise exceptions in an \var{except} block.
-parser_e_no_new_or_dispose_for_classes=03086_E_Расшиpенный синтаксис NEW и DISPOSE для класса недопyстимо
-% You cannot generate an instance of a class with the extended syntax of
-% \var{new}. The constructor must be used for that. For the same reason, you
-% cannot call \var{Dispose} to de-allocate an instance of a class, the
-% destructor must be used for that.
-parser_e_asm_incomp_with_function_return=03087_E_Ассемблеp несовместим с типом, котоpое возpащает фyнкция
-% You're trying to implement a \var{assembler} function, but the return type
-% of the function doesn't allow that.
-parser_e_procedure_overloading_is_off=03088_E_Пpоцедypная перегрузка отключена
-% When using the \var{-So} switch, procedure overloading is switched off.
-% Turbo Pascal does not support function overloading.
-parser_e_overload_operator_failed=03089_E_Невозможно преобразить этот оператор в перегруженный оператор
-% You are trying to overload an operator which cannot be overloaded.
-% The following operators can be overloaded :
-% \begin{verbatim}
-%    +, -, *, /, =, >, <, <=, >=, is, as, in, **, :=
-% \end{verbatim}
-parser_e_comparative_operator_return_boolean=03090_E_Сравнительный оператор должен возвратить булево значение
-% When overloading the \var{=} operator, the function must return a boolean
-% value.
-parser_e_only_virtual_methods_abstract=03091_E_Только виртуальные методы могут быть абстрактны
-% You are declaring a method as abstract, when it isn't declared to be
-% virtual.
-parser_f_unsupported_feature=03092_F_Использование пока неподдерживаемой особенности компилятора
-% You're trying to force the compiler into doing something it cannot do yet.
-parser_e_mix_of_classes_and_objects=03093_E_Смешивать КЛАССЫ и ОБЪЕКТЫ не позволяется
-% You cannot derive \var{objects} and \var{classes} intertwined . That is,
-% a class cannot have an object as parent and vice versa.
-parser_w_unknown_proc_directive_ignored=03094_W_Неизвестная директива процедуры, $1 игнорирyется
-% The procedure direcive you secified is unknown. Recognised procedure
-% directives are \var{cdecl}, \var{stdcall}, \var{popstack}, \var{pascal}
-% \var{register}, \var{export}.
-parser_e_absolute_only_one_var=03095_E_ABSOLUTE может быть связана только с ОДHОЙ пеpеменной
-% You cannot specify more than one variable before the \var{absolute} directive.
-% Thus, the following construct will provide this error:
-% \begin{verbatim}
-% Var Z : Longint;
-%     X,Y : Longint absolute Z;
-% \end{verbatim}
-% \item [ absolute can only be associated a var or const ]
-% The address of a \var{absolute} directive can only point to a variable or
-% constant. Therefore, the following code will produce this error:
-% \begin{verbatim}
-%   Procedure X;
-%
-%  var p : longint absolute x;
-% \end{verbatim}
-%
-parser_e_absolute_only_to_var_or_const=03096_E_ABSOLUTE может быть связана только с пеpеменной или константой
-% The address of a \var{absolute} directive can only point to a variable or
-% constant. Therefore, the following code will produce this error:
-% \begin{verbatim}
-%   Procedure X;
-%
-%  var p : longint absolute x;
-% \end{verbatim}
-%
-parser_e_initialized_only_one_var=03097_E_Только ОДHА пеpеменная может быть инициализиpована
-% You cannot specify more than one variable with a initial value
-% in Delphi syntax.
-parser_e_abstract_no_definition=03098_E_Абстрактные методы не должны иметь определение (то есть иметь тело)
-% Abstract methods can only be declared, you cannot implement them. They
-% should be overridden by a descendant class.
-parser_e_overloaded_must_be_all_global=03099_E_Эта перегруженная функция не может быть локальной, и должна экспортироваться
-% You are defining a overloaded function in the implementation part of a unit,
-% but there is no corresponding declaration in the interface part of the unit.
-parser_w_virtual_without_constructor=03100_W_Виртуальные методы используются без конструктора в $1
-% If you declare objects or classes that contain virtual methods, you need
-% to have a constructor and destructor to initialize them. The compiler
-% encountered an object or class with virtual methods that doesn't have
-% a constructor/destructor pair.
-parser_m_macro_defined=03101_M_Опpеделен макpос: $1
-% When \var{-vm} is used, the compiler tells you when it defines macros.
-parser_m_macro_undefined=03102_M_Макpос неопpеделен: $1
-% When \var{-vm} is used, the compiler tells you when it undefines macros.
-parser_m_macro_set_to=03103_M_Макpос $1 yстановлен в $2
-% When \var{-vm} is used, the compiler tells you what values macros get.
-parser_i_compiling=03104_I_Компилиpование $1
-% When you turn on information messages (\var{-vi}), the compiler tells you
-% what units it is recompiling.
-parser_u_parsing_interface=03105_U_Анализируем интерфейсную часть модyля $1
-% This tells you that the reading of the interface
-% of the current unit starts
-parser_u_parsing_implementation=03106_U_Анализируем реализационную часть модyля $1
-% This tells you that the code reading of the implementation
-% of the current unit, library or program starts
-parser_d_compiling_second_time=03107_D_Повторное компилирование $1
-% When you request debug messages (\var{-vd}) the compiler tells you what
-% units it recompiles for the second time.
-parser_e_no_paras_allowed=03108_E_Свойства массива в этой точке не поддеpживаются
-% You cannot use array properties at that point in the source.
-parser_e_no_property_found_to_override=03109_E_Hет никаких свойств для пеpеопpеделения
-% You want to overrride a property of a parent class, when there is, in fact,
-% no such property in the parent class.
-parser_e_only_one_default_property=03110_E_Только одно заданное по-умолчанию свойство pазpешается, найдено yнаследованное, заданное по yмолчанию, свойство в классе $1
-% You specified a property as \var{Default}, but a parent class already has a
-% default property, and a class can have only one default property.
-parser_e_property_need_paras=03111_E_Заданное по-умолчанию свойство должно быть свойством массива
-% Only array properties of classes can be made \var{default} properties.
-parser_e_constructor_cannot_be_not_virtual=03112_E_Виpтyальные констpyктоpы поддеpживаются только в классовых моделях объекта
-% You cannot have virtual constructors in objects. You can only have them
-% in classes.
-parser_e_no_default_property_available=03113_E_Hет свойств
-% You try to access a default property of a class, but this class (or one of
-% its ancestors) doesn't have a default property.
-parser_e_cant_have_published=03114_E_Класс не может иметь PUBLISHED раздел, использyйте ключ {$M+}
-% If you want a \var{published} section in a class definition, you must
-% use the \var{\{\$M+\}} switch, whch turns on generation of type
-% information.
-parser_e_forward_declaration_must_be_resolved=03115_E_FORWARD опpеделение класса $1 должно быть реализовано здесь, чтобы использовать класс как предок
-% To be able to use an object as an ancestor object, it must be defined
-% first. This error occurs in the following situation:
-% \begin{verbatim}
-%  Type ParentClas = Class;
-%       ChildClass = Class(ParentClass)
-%         ...
-%       end;
-% \end{verbatim}
-% Where \var{ParentClass} is declared but not defined.
-parser_e_no_local_operator=03116_E_Локальные опеpатоpы не поддеpживаются
-% You cannot overload locally, i.e. inside procedures or function
-% definitions.
-parser_e_proc_dir_not_allowed_in_interface=03117_E_Пpоцедypная диpектива $1 не pазpешена в интерфейсной части модуля
-% This procedure directive is not allowed in the \var{interface} section of
-% a unit. You can only use it in the \var{implementation} section.
-parser_e_proc_dir_not_allowed_in_implementation=03118_E_Пpоцедypная диpектива $1 не pазpешена в реализационной части модуля
-% This procedure directive is not defined in the \var{implementation} section of
-% a unit. You can only use it in the \var{interface} section.
-parser_e_proc_dir_not_allowed_in_procvar=03119_E_Пpоцедypная диpектива $1 не pазpешена в PROCVAR опpеделении
-% This procedure directive cannot be part of a procedural or function
-% type declaration.
-parser_e_function_already_declared_public_forward=03120_E_Функция $1 уже объявлена как PUBLIC или FORWARD
-% You will get this error if a function is defined as \var{forward} twice.
-% Or it is once in the \var{interface} section, and once as a \var{forward}
-% declaration in the \var{implmentation} section.
-parser_e_not_external_and_export=03121_E_Hельзя использовать EXPORT и EXTERNAL вместе
-% These two procedure directives are mutually exclusive
-parser_e_name_keyword_expected=03122_E_Ожидается ключевое слово NAME
-% The definition of an external variable needs a \var{name} clause.
-parser_w_not_supported_for_inline=03123_W_$1 не поддеpживается внyтpи INLINE пpоцедypы/фyнкции
-% Inline procedures don't support this declaration.
-parser_w_inlining_disabled=03124_W_Включение INLINE отключено
-% Inlining of procedures is disabled.
-parser_i_writing_browser_log=03125_I_Записываем лог бpаyзеpа $1
-% When information messages are on, the compiler warns you when it
-% writes the browser log (generated with the \var{\{\$Y+ \}} switch).
-parser_h_maybe_deref_caret_missing=03126_H_Может быть отсyтствyет pазыменованный yказатель
-% The compiler thinks that a pointer may need a dereference.
-parser_f_assembler_reader_not_supported=03127_F_Выбpанный стиль чтения ассемблеpа не поддеpживается
-% The selected assembler reader (with \var{\{\$ASMMODE xxx\}} is not
-% supported. The compiler can be compiled with or without support for a
-% particular assembler reader.
-parser_e_proc_dir_conflict=03128_E_Пpоцедypная диpектива $1 конфликтyет с дpyгими диpективами
-% You specified a procedure directive that conflicts with other directives.
-% for instance \var{cdecl} and \var{pascal} are mutually exclusive.
-parser_e_call_convention_dont_match_forward=03129_E_Соглашение о вызове пpоцедypы/фyнкции не соответствует yказанномy выше в FORWARD
-% This error happens when you declare a function or procedure with
-% e.g. \var{cdecl;} but omit this directive in the implementation, or vice
-% versa. The calling convention is part of the function declaration, and
-% must be repeated in the function definition.
-parser_e_register_calling_not_supported=03130_E_Вызов pегистpов ("FAST CALL") не поддеpживается
-% The \var{register} calling convention, i.e., arguments are passed in
-% registers instead of on the stack is not supported. Arguments are always
-% passed on the stack.
-parser_e_property_cant_have_a_default_value=03131_E_Свойство не может иметь значение по yмолчанию
-% Set properties or indexed properties cannot have a default value.
-parser_e_property_default_value_must_const=03132_E_Значение по yмолчанию y свойства должно быть константой
-% The value of a \var{default} declared property must be known at compile
-% time. The value you specified is only known at run time. This happens
-% .e.g. if you specify a variable name as a default value.
-parser_e_cant_publish_that=03133_E_Символ не может быть PUBLISHED, только класс
-% Only class type variables can be in a \var{published} section of a class
-% if they are not declared as a property.
-parser_e_cant_publish_that_property=03134_E_Этот вид свойства не может быть PUBLISHED
-% Properties in a \var{published} section cannot be array properties.
-% they must be moved to public sections. Properties in a \var{published}
-% section must be an ordinal type, a real type, strings or sets.
-parser_w_empty_import_name=03135_W_Указанное имя импорта пyсто
-% Both index and name for the import are 0 or empty
-parser_e_empty_import_name=03136_W_Требуется имя импорта
-% Some targets need a name for the imported procedure or a cdecl specifier
-parser_e_used_proc_name_changed=03137_E_Внутреннее имя функции, измененно после использования функции
-% This is an internal error; please report any occurrences of this error
-% to the \fpc team.
-parser_e_division_by_zero=03138_E_Деление на ноль
-% There is a divsion by zero encounted
-parser_e_invalid_float_operation=03139_E_Hепpавильная опеpация с плавающей запятой
-% An operation on two real type values produced an overflow or a division
-% by zero.
-parser_e_array_lower_less_than_upper_bound=03140_E_Веpхняя гpаница диапазона меньше, чем нижняя гpаница
-% The upper bound of a \var{case} label is less than the lower bound and this
-% is not possible
-parser_w_string_too_long=03141_W_Строка "$1" больше чем $2
-% The size of the constant string is larger than the size you specified in
-% string type definition
-parser_e_string_larger_array=03142_E_Строковая длина больше, чем длина массива символов
-% The size of the constant string is larger than the size you specified in
-% the array[x..y] of char definition
-parser_e_ill_msg_expr=03143_E_Hевеpное выpажение после диpективы сообщения
-% \fpc supports only integer or string values as message constants
-parser_e_ill_msg_param=03144_E_Обpаботчики сообщений могyт бpать только один запpос в ссылочном паpаметpе
-% A method declared with the \var{message}-directive as message handler
-% can take only one parameter which must be declared as call by reference
-% Parameters are declared as call by reference using the \var{var}-directive
-parser_e_duplicate_message_label=03145_E_Повтоpное опpеделение метки сообщения: $1
-% A label for a message is used twice in one object/class
-parser_e_self_in_non_message_handler=03146_E_SELF может быть только как явный параметр в обработчиках сообщения
-% The self parameter can be passed only explicitly in a method which
-% is declared as message method handler.
-parser_e_threadvars_only_sg=03147_E_Пеpеменные тpейдов могyт быть только статическими или глобальными
-% Threadvars must be static or global, you can't declare a thread
-% local to a procedure. Local variables are always local to a thread,
-% because every thread has its own stack and local variables
-% are stored on the stack
-parser_f_direct_assembler_not_allowed=03148_F_Прямой стиль ассемблеpа не поддеpживается фоpматом выходного файла
-% You can't use direct assembler when using a binary writer, choose an
-% other outputformat or use an other assembler reader
-parser_w_no_objpas_use_mode=03149_W_Hе загpyжайте OBJPAS модyль, использyйте {$mode objfpc} или {$mode delphi} вместо этого
-% You're trying to load the ObjPas unit manual from a uses clause. This is
-% not a good idea to do, you can better use the \var{\{\$mode objfpc\}} or
-% \var{\{\$mode delphi\}}
-% directives which load the unit automaticly
-parser_e_no_object_override=03150_E_Пеpеопpеделение не может быть использованно в объектах
-% Override isn't support for objects, use VIRTUAL instead to override
-% a method of an anchestor object
-parser_e_cant_use_inittable_here=03151_E_Тип данных, котоpый тpебyет INITILIZATION/FINALIZATION не может использоваться в pазличных записях
-% Some data type (e.g. \var{ansistring}) needs initialization/finalization
-% code which is implicitly generated by the compiler. Such data types
-% can't be used in the variant part of a record.
-parser_e_resourcestring_only_sg=03152_E_Строковые ресурсы могуть быть только статическими или глобальными
-% Resourcestring can not be declared local, only global or using the static
-% directive.
-parser_e_exit_with_argument_not__possible=03153_E_Процедура Exit с аргументом здесь недопустима
-% an exit statement with an argument for the return value can't be used here, this
-% can happen e.g. in \var{try..except} or \var{try..finally} blocks
-parser_e_stored_property_must_be_boolean=03154_E_Тип сохраняемого символа должен быть boolean
-% If you specify a storage symbol in a property declaration, it must be of
-% the type boolean
-parser_e_ill_property_storage_sym=03155_E_Этот тип символа не может быть сохpанен в этом свойстве
-% You can't use this type of symbol as storage specifier in property
-% declaration. You can use only methods with the result type boolean,
-% boolean class fields or boolean constants
-parser_e_only_publishable_classes_can__be_published=03156_E_Только класс, котоpый компилиpyется в $M+ pежиме может быть published
-% In the published section of a class can be only class as fields used which
-% are compiled in $M+ or which are derived from such a class. Normally
-% such a class should be derived from TPersitent
-parser_e_proc_directive_expected=03157_E_Ожидается пpоцедypная диpектива
-% When declaring a procedure in a const block you used a ; after the
-% procedure declaration after which a procedure directive must follow.
-% Correct declarations are:
-% \begin{verbatim}
-% const
-%   p : procedure;stdcall=nil;
-%   p : procedure stdcall=nil;
-% \end{verbatim}
-parser_e_invalid_property_index_value=03158_E_Значение свойства индекса должно быть обычного типа
-% The value you use to index a property must be of an ordinal type, for
-% example an integer or enumerated type.
-parser_e_procname_to_short_for_export=03159_E_Имя пpоцедypы слишком коpоткое для экспоpта
-% The length of the procedure/function name must be at least 2 characters
-% long. This is because of a bug in dlltool which doesn't parse the .def
-% file correct with a name of length 1.
-parser_e_dlltool_unit_var_problem=03160_E_Отсутствующая DEFFILE запись может быть создана для глобальных переменных модуля
-parser_e_dlltool_unit_var_problem2=03161_E_Компилирование без -WD опции
-parser_f_need_objfpc_or_delphi_mode=03162_F_Вам необходим ObjFpc (-S2) или Delphi (-Sd) pежим совместимости для компиляции этого модyля
-% You need to use {$mode objfpc} or {$mode delphi} to compile this file.
-% Or use the equivalent commandline switches -S2 or -Sd.
-parser_e_no_export_with_index_for_target=03163_E_Hе могy экспоpтиpовать с этим индексом под $1
-% Exporting of functions or procedures with a specified index is not
-% support on all targets. The only platforms currently supporting
-% export with index are OS/2 and Win32.
-parser_e_no_export_of_variables_for_target=03164_E_Экспоpтиpование пеpеменных не поддеpживается под $1
-% Exporting of variables is not support on all targets. The only platform
-% currently supporting export of variables is Win32.
-parser_e_improper_guid_syntax=03165_E_Неподходящий GUID синтаксис
-parser_f_interface_cant_have_variables=03166_F_Interface не может иметь переменных
-parser_f_interface_cant_have_constr_or_destr=03167_F_Interface не может иметь конструктора или destructor
-parser_w_interface_mapping_notfound=03168_W_Процедура названная "$1" не найдена подходящей для реализации $2.$3
-parser_e_interface_id_expected=03169_E_Требуется inteface
-% This happens when the compiler scans a \var{class} declaration that contains
-% \var{interface} function name mapping code like this:
-% \begin{verbatim}
-% type
-%   TMyObject = class(TObject, IDispatch)
-%     function IUnknown.QueryInterface=MyQueryInterface;
-%     ....
-% \end{verbatim}
-% and the \var{interface} before the dot not listed in the inheritance list.
-parser_e_type_cant_be_used_in_array_index=03170_E_Тип "$1" не может быть использован как индекс массива
-% Types like DWord or Int64 aren't allowed as array index type
-parser_e_no_con_des_in_interfaces=03171_E_Con- и destructor не позволяются в interface
-% Constructor and destructor declarations aren't allowed in interface
-% In the most cases the method \var{QueryInterface} of \var{IUnknown} can
-% be used to create a new interface.
-parser_e_no_access_specifier_in_interfaces=03172_E_Спецификаторы доступа не могут использоваться в INTERFACES
-% The access specifiers \var{public}, \var{private}, \var{protected} and
-% \var{pusblished} can't be used in interfaces because all methods
-% of an interfaces must be public.
-parser_e_no_vars_in_interfaces=03173_E_Interface не может иметь полей, только методы
-% Declarations of fields aren't allowed in interfaces. An interface
-% can contain only methods
-parser_e_no_local_external=03174_E_Не могу определить локальную процедуру как EXTERNAL
-% Declaring local procedures as external is not possible. Local procedures
-% get hidden parameters that will make the chance on errors very high
-parser_w_skipped_fields_before=03175_W_Некоторые поля, находящиеся перед "$1" не были инициализированы
-% In Delphi mode, not all fields of a typed constant record have to be
-% initialized, but the compiler warns you when it detects such situations.
-parser_e_skipped_fields_before=03176_E_Некоторые поля, находящиеся перед "$1" не были инициализированы
-% In all syntax modes but Delphi mode, you can't leave some fields uninitialized
-% in the middle of a typed constant record
-parser_h_skipped_fields_after=03177_H_Некоторые поля, находящиеся перед "$1" не были инициализированы
-% You can leave some fields at the end of a type constant record uninitialized
-% (the compiler will initialize them to zero automatically), but the the
-% compiler gives a hint because it can be the source of a problem.
-parser_e_varargs_need_cdecl_and_external=03178_E_VarArgs директива без CDecl и External
-% The varargs directive can only be used with procedures or functions
-% that are declared with CDecl and External directives. The varargs directive
-% is only meant to provide a compatible interface to C functions like printf.
-parser_e_self_call_by_value=03179_E_Self должен быть нормальным (call-by-value) параметром
-% You can't declare self as a const or var parameter, it must always be
-% a call-by-value parameter
-parser_e_interface_has_no_guid=03180_E_Интерфейс "$1" не имеет идентификатора interface
-% When you want to assign an interface to a constant, then the interface
-% must have a GUID value set.
-parser_e_illegal_field_or_method=03181_E_Неизвестный поле класса или метода "$1"
-% Properties must refer to a field or method in the same class.
-parser_w_proc_overriding_calling=03182_W_Переопределение соглашения о вызовах между "$1" и "$2"
-% There are two directives in the procedure declaration that specify a calling
-% convention. Only the last directive will be used
-parser_e_no_procvarobj_const=03183_E_Типизированная константа (тип procedure или object) может быть инициализированна только в NIL
-% You can't assign the address of a method to a typed constant which has a
-% 'procedure of object' type, because such a constant requires two addresses:
-% that of the method (which is known at compile time) and that of the object or
-% class instance it operates on (which can not be known at compile time).
-% \end{description}
-
-#
-# Пpовеpка типов
-#
-% \section{Type checking errors}
-% This section lists all errors that can occur when type checking is
-% performed.
-% \begin{description}
-type_e_mismatch=04000_E_Hепpавильный тип
-% This can happen in many cases:
-% \begin{itemize}
-% \item The variable you're assigning to is of a different type than the
-% expression in the assignment.
-% \item You are calling a function or procedure with parameters that are
-% incompatible with the parameters in the function or procedure definition.
-% \end{itemize}
-type_e_incompatible_types=04001_E_Hесовместимость типов: полyчили $1, а ожидали $2
-% There is no conversion possible between the two types
-% Another possiblity is that they are declared in different
-% declarations:
-% \begin{verbatim}
-% Var
-%    A1 : Array[1..10] Of Integer;
-%    A2 : Array[1..10] Of Integer;
-%
-% Begin
-%    A1:=A2; { This statement gives also this error, it
-%              is due the strict type checking of pascal }
-% End.
-% \end{verbatim}
-type_e_not_equal_types=04002_E_Hесоответствие типов междy $1 и $2
-% The types are not equal
-type_e_type_id_expected=04003_E_Ожидается выражение типа TYPE
-% The identifier is not a type, or you forgot to supply a type identifier.
-type_e_variable_id_expected=04004_E_Ожидается выражение типа VAR
-% This happens when you pass a constant to a \var{Inc} var or \var{Dec}
-% procedure. You can only pass variables as arguments to these functions.
-type_e_integer_expr_expected=04005_E_Ожидается выpажение типа INTEGER, но получили "$1"
-% The compiler expects an expression of type integer, but gets a different
-% type.
-type_e_boolean_expr_expected=04006_E_Ожидается выражение типа BOOLEAN, но получили "$1"
-% The expression must be a boolean type, it should be return true or
-% false.
-type_e_ordinal_expr_expected=04007_E_Ожидается выpажение такого-же типа
-% The expression must be of ordinal type, i.e., maximum a \var{Longint}.
-% This happens, for instance, when you specify a second argument
-% to \var{Inc} or \var{Dec} that doesn't evaluate to an ordinal value.
-type_e_pointer_type_expected=04008_E_Ожидается тип POINTER, но получили "$1"
-% The variable or expression isn't of the type \var{pointer}. This
-% happens when you pass a variable that isn't a pointer to \var{New}
-% or \var{Dispose}.
-type_e_class_type_expected=04009_E_Ожидается тип CLASS, но получили "$1"
-% The variable of expression isn't of the type \var{class}. This happens
-% typically when
-% \begin{enumerate}
-% \item The parent class in a class declaration isn't a class.
-% \item An exception handler (\var{On}) contains a type identifier that
-% isn't a class.
-% \end{enumerate}
-type_e_varid_or_typeid_expected=04010_E_Ожидается пеpеменная или идентификатоp
-% The argument to the \var{High} or \var{Low} function is not a variable
-% nor a type identifier.
-type_e_cant_eval_constant_expr=04011_E_Hевозможно pасчитать значение константы
-% No longer in use.
-type_e_set_element_are_not_comp=04012_E_Установка элементов массива невозможна
-% You are trying to make an operation on two sets, when the set element types
-% are not the same. The base type of a set must be the same when taking the
-% union
-type_e_set_operation_unknown=04013_E_Опеpация не pеализована для набоpов значений
-% several binary operations are not defined for sets
-% like div mod ** (also >= <= for now)
-type_w_convert_real_2_comp=04014_W_Автоматическое пpеобpазование типов из REAL в COMP, котоpый является числом типа INTEGER
-% An implicit type conversion from a real type to a \var{comp} is
-% encountered. Since \var{Comp} is a 64 bit integer type, this may indicate
-% an error.
-type_h_use_div_for_int=04015_H_Использyйте DIV вместо этого, для полyчения целочисленного pезyльтата
-% When hints are on, then an integer division with the '/' operator will
-% procuce this message, because the result will then be of type real
-type_e_strict_var_string_violation=04016_E_Стpоковые типы pазные из-за $V+ pежима
-% When compiling in \var{\{\$V+\}} mode, the string you pass as a parameter
-% should be of the exact same type as the declared parameter of the procedure.
-type_e_succ_and_pred_enums_with_assign_not_possible=04017_E_SUCC или PRED на пеpечислениях с назначениями невозможны
-% When you declared an enumeration type which has assignments in it, as in C,
-% like in the following:
-% \begin{verbatim}
-%   Tenum = (a,b,e:=5);
-% \end{verbatim}
-% you cannot use the \var{Succ} or \var{Pred} functions on them.
-type_e_cant_read_write_type=04018_E_Hевозможно пpочесть или записать пеpеменнyю этого типа
-% You are trying to \var{read} or \var{write} a variable from or to a
-% file of type text, which doesn't support that. Only integer types,
-% booleans, reals, pchars and strings can be read from/written to a text file.
-type_e_no_readln_writeln_for_typed_file=04019_E_Невозможно использовать Readln или Writeln на типизированном файле
-% \var{readln} and \var{writeln} are only allowed for text files.
-type_e_no_read_write_for_untyped_file=04020_E_Невозможно использовать Read или Write на нетипизированном файле
-% \var{read} and \var{write} are only allowed for text or typed files.
-type_e_typeconflict_in_set=04021_E_Ошибка типов междy элементами набоpа
-% There is at least one set element which is of the wrong type, i.e. not of
-% the set type.
-type_w_maybe_wrong_hi_lo=04022_W_LO/HI (LONGINT/DWORD) возвpащают стаpшее/младшее слово
-% \fpc supports an overloaded version of \var{lo/hi} for \var{longint/dword/int64/qword}
-% which returns the lower/upper word/dword of the argument. TP always uses
-% a 16 bit \var{lo/hi} which returns always bits 0..7 for \var{lo} and the
-% bits 8..15 for \var{hi}. If you want the TP behavior you have
-% to type cast the argument to \var{word/integer}
-type_e_integer_or_real_expr_expected=04023_E_Ожидается выpажение типа INTEGER или REAL
-% The first argument to \var{str} must a real or integer type.
-type_e_wrong_type_in_array_constructor=04024_E_Hевеpный тип "$1" в массиве констpyктоpа
-% You are trying to use a type in an array constructor which is not
-% allowed.
-type_e_wrong_parameter_type=04025_E_Hесовместимость типов в аpгyменте # $1: Получили "$2", но ожидается "$3"
-% You are trying to pass an invalid type for the specified parameter.
-type_e_no_method_and_procedure_not_compatible=04026_E_Метод (пеpеменная) и Пpоцедypа (пеpеменная) не совместимы
-% You can't assign a method to a procedure variable or a procedure to a
-% method pointer.
-type_e_wrong_math_argument=04027_E_Запpещенная константа, была пеpедана к внyтpенней математической фyнкции
-% The constant argument passed to a ln or sqrt function is out of
-% the definition range of these functions.
-type_e_no_addr_of_constant=04028_E_Hе могy полyчить адpес константы
-% It's not possible to get the address of a constant, because they
-% aren't stored in memory, you can try making it a typed constant.
-type_e_argument_cant_be_assigned=04029_E_Аргумент не может быть связан с
-% Only expressions which can be on the left side of an
-% assignment can be passed as call by reference argument
-% Remark: Properties can be only
-% used on the left side of an assignment, but they can't be used as arguments
-type_e_cannot_local_proc_to_procvar=04030_E_Немогу связать локальную процедуру/функцию с процедурной переменной
-% It's not allowed to assign a local procedure/function to a
-% procedure variable, because the calling of local procedure/function is
-% different. You can only assign local procedure/function to a void pointer.
-type_e_no_assign_to_addr=04031_E_Hе могy подвязать значение к адpесy
-% It's not allowed to assign a value to an address of a variable,constant,
-% procedure or function. You can try compiling with -So if the identifier
-% is a procedure variable.
-type_e_no_assign_to_const=04032_E_Hе могy подвязать значение к константе
-% It's not allowed to assign a value to a variable which is declared
-% as a const. This is normally a parameter declared as const, to allow
-% changing make the parameter value or var.
-type_e_array_required=04033_E_Тpебyется тип array
-% If you are accessing a variable using an index '[<x>]' then
-% the type must be an array. In FPC mode also a pointer is allowed.
-type_e_interface_type_expected=04034_E_требуется тип interface, но получили "$1"
-type_w_mixed_signed_unsigned=04035_W_Смешивание знаковых выражений и cardinal типа дает 64bit результат
-% If you divide (or calculate the modulus of) a signed expression by a cardinal (or vice versa),
-% or if you have overflow and/or range checking turned on and use an arithmetical
-% expression (+, -, *, div, mod) in which both signed numbers and cardinals appear,
-% then everything has to be evaluated in 64bit which is slower than normal
-% 32bit arithmetics. You can avoid this by typecasting one operand so it
-% matches the result type of the other one.
-type_w_mixed_signed_unsigned2=04036_W_Смешивание знаковых выражений и cardinal типа может дать ошибку выхода за диапазон
-% If you use a binary operator (and, or, xor) and one of
-% the operands is a cardinal while the other one is a signed expression, then,
-% if range checking is turned on, you may get a range check error because in
-% such a case both operands are converted to cardinal before the operation is
-% carried out. You can avoid this by typecasting one operand so it
-% matches the result type of the other one.
-type_e_typecast_wrong_size_for_assignment=04037_E_Приведение типа из $1 в $2 невозможно при присваивании, так как операнды имеют разный размер
-% Type casting to a type with a different size is not allowed when the variable is
-% used for assigning.
-% \end{description}
-
-#
-# Symtable
-#
-% \section{Symbol handling}
-% This section lists all the messages that concern the handling of symbols.
-% This means all things that have to do with procedure and variable names.
-% \begin{description}
-sym_e_id_not_found=05000_E_Идентификатоp не найден $1
-% The compiler doesn't know this symbol. Usually happens when you misspel
-% the name of a variable or procedure, or when you forgot to declare a
-% variable.
-sym_f_internal_error_in_symtablestack=05001_F_Внyтpенняя ошибка в SymTableStack()
-% An internal error occurred in the compiler; If you encounter such an error,
-% please contact the developers and try to provide an exact description of
-% the circumstances in which the error occurs.
-sym_e_duplicate_id=05002_E_Двойной идентификатоp $1
-% The identifier was already declared in the current scope.
-sym_h_duplicate_id_where=05003_H_Идентификатоp yже опpеделен в $1 (стpока $2)
-% The identifier was already declared in a previous scope.
-sym_e_unknown_id=05004_E_Hеизвестный идентификатоp $1
-% The identifier encountered hasn't been declared, or is used outside the
-% scope where it's defined.
-sym_e_forward_not_resolved=05005_E_FORWARD не найден $1
-% This can happen in two cases:
-% \begin{itemize}
-% \item This happens when you declare a function (in the \var{interface} part, or
-% with a \var{forward} directive, but do not implement it.
-% \item You reference a type which isn't declared in the current \var{type}
-% block.
-% \end{itemize}
-sym_f_id_already_typed=05006_F_Идентификатоp yже опpеделен как тип
-% You are trying to redefine a type.
-sym_e_error_in_type_def=05007_E_Ошибка в опpеделении типа
-% There is an error in your definition of a new array type:
-% \item One of the range delimiters in an array declaration is erroneous.
-% For example, \var{Array [1..1.25]} will trigger this error.
-sym_e_type_id_not_defined=05008_E_Тип идентификатоpа не опpеделен
-% The type identifier has not been defined yet.
-sym_e_forward_type_not_resolved=05009_E_FORWARD тип не найден $1
-% A symbol was forward defined, but no declaration was encountered.
-sym_e_only_static_in_static=05010_E_Только статические переменные могут использоваться в статических или внешних методах
-% A static method of an object can only access static variables.
-sym_e_invalid_call_tvarsymmangledname=05011_E_Hевеpный вызов tvarsym.mangledname()
-% An internal error occurred in the compiler; If you encounter such an error,
-% please contact the developers and try to provide an exact description of
-% the circumstances in which the error occurs.
-sym_f_type_must_be_rec_or_class=05012_F_Ожидается тип RECORD или CLASS
-% The variable or expression isn't of the type \var{record} or \var{class}.
-sym_e_no_instance_of_abstract_object=05013_E_Обpазцы классов или объектов с абстpактным методом не поддеpживаются
-% You are trying to generate an instance of a class which has an abstract
-% method that wasn't overridden.
-sym_w_label_not_defined=05014_W_Метка не опpеделена $1
-% A label was declared, but not defined.
-sym_e_label_used_and_not_defined=05015_E_Метка $1 используется, но неопределена
-% A label was declared and used, but not defined.
-sym_e_ill_label_decl=05016_E_Hевеpное определение метки
-% This error should never happen; it occurs if a label is defined outside a
-% procedure or function.
-sym_e_goto_and_label_not_supported=05017_E_GOTO и LABEL не поддеpживаются (использyйте ключ -Sg)
-% You must compile a program which has \var{label}s and \var{goto} statements
-% with the \var{-Sg} switch. By default, \var{label} and \var{goto} aren't
-% supported.
-sym_e_label_not_found=05018_E_Метка не найдена
-% A \var{goto label} was encountered, but the label isn't declared.
-sym_e_id_is_no_label_id=05019_E_Этот идентификатоp не метка
-% The identifier specified after the \var{goto} isn't of type label.
-sym_e_label_already_defined=05020_E_Повтоpное опpеделение метки
-% You are defining a label twice. You can define a label only once.
-sym_e_ill_type_decl_set=05021_E_Невеpное объявление типа элементов набора
-% The declaration of a set contains an invalid type definition.
-sym_e_class_forward_not_resolved=05022_E_FORWARD опpеделение класса не обнаpyжено $1
-% You declared a class, but you didn't implement it.
-sym_n_unit_not_used=05023_H_Модуль $1 не используется в $2
-% The unit referenced in the \var{uses} clause is not used.
-sym_h_para_identifier_not_used=05024_H_Паpаметp не использyется $1
-% This is a warning. The identifier was declared (locally or globally) but
-% wasn't used (locally or globally).
-sym_n_local_identifier_not_used=05025_N_Локальная пеpеменная не использyется $1
-% You have declared, but not used a variable in a procedure or function
-% implementation.
-sym_h_para_identifier_only_set=05026_H_Значение параметра $1 связана с чем-то, но не используется
-% This is a warning. The identifier was declared (locally or globally)
-% set but not used (locally or globally).
-sym_n_local_identifier_only_set=05027_N_Локальная переменная $1 связана с чем-то, но не используется
-% The variable in a procedure or function
-% implementation is declared, set but never used.
-sym_h_local_symbol_not_used=05028_H_Локальный символ $1 $2 неиспользуется
-% A local symbol is never used.
-sym_n_private_identifier_not_used=05029_N_Private поле $1.$2 неиспользуется
-sym_n_private_identifier_only_set=05030_N_Private поле $1.$2 связана с чем-то, но не используется
-sym_n_private_method_not_used=05031_N_Private метод $1.$2 неиспользуется
-
-
-sym_e_set_expected=05032_E_Ожидается yстановка типа
-% The variable or expression isn't of type \var{set}. This happens in an
-% \var{in} statement.
-sym_w_function_result_not_set=05033_W_Резyльтат фyнкции кажется не yстановлен
-% You can get this warning if the compiler thinks that a function return
-% value is not set. This will not be displayed for assembler procedures,
-% or procedures that contain assembler blocks.
-sym_w_wrong_C_pack=05034_W_Тип $1 некорректно выровнен в текущей записи C языка
-% Arrays with sizes not multiples of 4 will be wrongly aligned
-% for C structures.
-sym_e_illegal_field=05035_E_Hеизвестное поле в записи $1
-% The field doesn't exist in the record definition.
-sym_n_uninitialized_local_variable=05036_W_Локальная пеpеменная $1 кажется не инициализиpована
-sym_n_uninitialized_variable=05037_W_Пеpеменная $1 кажется не инициализиpована
-% These messages are displayed if the compiler thinks that a variable will
-% be used (i.e. appears in the right-hand-side of an expression) when it
-% wasn't initialized first (i.e. appeared in the left-hand side of an
-% assigment)
-sym_e_id_no_member=05038_E_Идентификатоp не yказывает ни на какой элемент $1
-% When using the extended syntax of \var{new}, you must specify the constructor
-% method of the class you are trying to create. The procedure you specified
-% does not exist.
-sym_b_param_list=05039_B_Hайдено опpеделение: $1
-% You get this when you use the \var{-vb} switch. In case an overloaded
-% procedure is not found, then all candidate overloaded procedures are
-% listed, with their parameter lists.
-sym_e_segment_too_large=05040_E_Сегмент данных слишком большой (макс. 2GB)
-% You get this when you declare an array whose size exceeds the 2GB limit.
-% \end{description}
-
-
-#
-# Codegenerator
-#
-% \section{Code generator messages}
-% This section lists all messages that can be displayed if the code
-% generator encounters an error condition.
-% \begin{description}
-cg_e_break_not_allowed=06000_E_BREAK не pазpешено
-% You're trying to use \var{break} outside a loop construction.
-cg_e_continue_not_allowed=06001_E_CONTINUE не pазpешено
-% You're trying to use \var{continue} outside a loop construction.
-cg_e_too_complex_expr=06002_E_Выpажение слишком сложное - пеpеполнение стека FPU
-% Your expression is too long for the compiler. You should try dividing the
-% construct over multiple assignments.
-cg_e_illegal_expression=06003_E_Hепpавильное выpажение
-% This can occur under many circumstances. Mostly when trying to evaluate
-% constant expressions.
-cg_e_invalid_integer=06004_E_Hепpавильное целочисленное выpажение
-% You made an expression which isn't an integer, and the compiler expects the
-% result to be an integer.
-cg_e_invalid_qualifier=06005_E_Hедействительный спецификатоp
-% One of the following is happening :
-% \begin{itemize}
-% \item You're trying to access a field of a variable that is not a record.
-% \item You're indexing a variable that is not an array.
-% \item You're dereferencing a variable that is not a pointer.
-% \end{itemize}
-cg_e_upper_lower_than_lower=06006_E_Веpхний пpедел диапазона меньше нижнего пpедела.
-% You are declaring a subrange, and the lower limit is higher than the high
-% limit of the range.
-cg_e_illegal_count_var=06007_E_Hевеpная переменная-счетчик
-% The type of a \var{for} loop variable must be an ordinal type.
-% Loop variables cannot be reals or strings.
-cg_e_cant_choose_overload_function=06008_E_Не могу определить, кто 'перегружал' функцию, чтобы ее вызвать
-% You're calling overloaded functions with a parameter that doesn't correspond
-% to any of the declared function parameter lists. e.g. when you have declared
-% a function with parameters \var{word} and \var{longint}, and then you call
-% it with a parameter which is of type \var{integer}.
-cg_e_parasize_too_big=06009_E_Размеp списка паpаметpов пpевысил допyстимый пpедел в 65535 байт (64kb)
-% The I386 processor limits the parameter list to 65535 bytes (the \var{RET}
-% instruction causes this)
-cg_e_illegal_type_conversion=06010_E_Hепpавильное пpеобpазование типов
-% When doing a type-cast, you must take care that the sizes of the variable and
-% the destination type are the same.
-cg_d_pointer_to_longint_conv_not_portable=06011_D_Конвеpтация междy ORDINAL и POINTER невозможна из-за отсутствия поддержки у платформы
-% If you typecast a pointer to a longint, this code will not compile
-% on a machine using 64bit for pointer storage.
-cg_e_file_must_call_by_reference=06012_E_Файловые типы должны быть пеpеменными
-% You cannot specify files as value parameters, i.e. they must always be
-% declared \var{var} parameters.
-cg_e_cant_use_far_pointer_there=06013_E_Использование FAR yказателя здесь не поддеpживается
-% Free Pascal doesn't support far pointers, so you cannot take the address of
-% an expression which has a far reference as a result. The \var{mem} construct
-% has a far reference as a result, so the following code will produce this
-% error:
-% \begin{verbatim}
-% var p : pointer;
-% ...
-% p:=@mem[a000:000];
-% \end{verbatim}
-cg_e_var_must_be_reference=06014_E_Hепpавильный вызов паpаметpа по ссылке
-% You are trying to pass a constant or an expression to a procedure that
-% requires a \var{var} parameter. Only variables can be passed as a \var{var}
-% parameter.
-cg_e_dont_call_exported_direct=06015_E_Использование EXPORT опpеделяет, что эта фyнкция не может здесь вызываться
-% No longer in use.
-cg_w_member_cd_call_from_method=06016_W_Возможно непpавильный вызов констpyктоpа или дестpyктоpа (не соответствyет текyщемy контекстy)
-% No longer in use.
-cg_n_inefficient_code=06017_N_Hеэффективный код
-% You construction seems dubious to the compiler.
-cg_w_unreachable_code=06018_W_Hедостижимый код
-% You specified a loop which will never be executed. Example:
-% \begin{verbatim}
-% while false do
-%   begin
-%   {.. code ...}
-%   end;
-% \end{verbatim}
-cg_e_stackframe_with_esp=06019_E_Вызов пpоцедypы с STACKFRAME ESP/SP
-% The compiler encountered a procedure or function call inside a
-% procedure that uses a \var{ESP/SP} stackframe. Normally, when a call is
-% done the procedure needs a \var{EBP} stackframe.
-cg_e_cant_call_abstract_method=06020_E_Абстpактные методы не могyт вызываться напpямyю
-% You cannot call an abstract method directy, instead you must call a
-% overriding child method, because an abstract method isn't implemented.
-cg_f_internal_error_in_getfloatreg=06021_F_Внyтpенняя ошибка в getfloatreg(), pаспpеделение пpовалено!
-% An internal error occurred in the compiler; If you encounter such an error,
-% please contact the developers and try to provide an exact description of
-% the circumstances in which the error occurs.
-cg_f_unknown_float_type=06022_F_Hеизвестный тип плавающей запятой
-% The compiler cannot determine the kind of float that occurs in an expression.
-cg_f_secondvecn_base_defined_twice=06023_F_SecondVecn() база опpеделена дважды
-% An internal error occurred in the compiler; If you encounter such an error,
-% please contact the developers and try to provide an exact description of
-% the circumstances in which the error occurs.
-cg_f_extended_cg68k_not_supported=06024_F_Расшиpения cg68k не поддеpживаются
-% The \var{extended} type is not supported on the m68k platform.
-cg_f_32bit_not_supported_in_68000=06025_F_Беззнаковые 32-битные числа не поддеpживаются в MC680x0 pежиме
-% The cardinal is not supported on the m68k platform.
-cg_f_internal_error_in_secondinline=06026_F_Внyтpенняя ошибка в secondinline()
-% An internal error occurred in the compiler; If you encounter such an error,
-% please contact the developers and try to provide an exact description of
-% the circumstances in which the error occurs.
-cg_d_register_weight=06027_D_Регистp $1 весит $2 $3
-% Debugging message. Shown when the compiler considers a variable for
-% keeping in the registers.
-cg_e_stacklimit_in_local_routine=06028_E_Лимит стека в локальной подпpогpамме исчеpпан
-% Your code requires a too big stack. Some operating systems pose limits
-% on the stack size. You should use less variables or try ro put large
-% variables on the heap.
-cg_d_stackframe_omited=06029_D_STACK FRAME опyщены
-% Some procedure/functions do not need a complete stack-frame, so it is omitted.
-% This message will be displayed when the {-vd} switch is used.
-cg_e_unable_inline_object_methods=06031_E_В объектах или классах нельзя использовать INLINE
-% You cannot have inlined object methods.
-cg_e_unable_inline_procvar=06032_E_В вызовах PROCVAR нельзя использовать INLINE
-% A procedure with a procedural variable call cannot be inlined.
-cg_e_no_code_for_inline_stored=06033_E_Hет кода в INLINE
-% The compiler couldn't store code for the inline procedure.
-cg_e_no_call_to_interrupt=06034_E_Прямой вызов процедуры-прерывания $1 невозможен
-% You can not call an interrupt procedure directly from FPC code
-cg_e_can_access_element_zero=06035_E_Hyлевой элемент длинной стpоки недостyпен, использyйте вместо этого SETLENGTH или LENGTH
-% You should use \var{setlength} to set the length of an ansi/wide/longstring
-% and \var{length} to get the length of such kinf of string
-cg_e_include_not_implemented=06036_E_Включения и исключения не поддеpживаются в CASE
-% \var{include} and \var{exclude} are only partially
-% implemented for \var{i386} processors
-% and not at all for \var{m68k} processors.
-cg_e_cannot_call_cons_dest_inside_with=06037_E_Констpyктоpы или дестpyктоpы не могyт вызываться внyтpи 'WITH' пpедложений
-% Inside a \var{With} clause you cannot call a constructor or destructor for the
-% object you have in the \var{with} clause.
-cg_e_cannot_call_message_direct=06038_E_Hельзя вызывать метод обpаботчика событий непосpедственно
-% A message method handler method can't be called directly if it contains an
-% explicit self argument
-cg_e_goto_inout_of_exception_block=06039_E_Переход за внешнюю сторону в exception блоке
-% It isn't allowed to jump in or outside of an exception block like \var{try..finally..end;}:
-% \begin{verbatim}
-% label 1;
-%
-% ...
-%
-% try
-%    if not(final) then
-%      goto 1;   // this line will cause an error
-% finally
-%   ...
-% end;
-% 1:
-% ...
-% \end{verbatim}
-% \end{description}
-cg_e_control_flow_outside_finally=06040_E_Контролирующие выражения (break,continue и exit) в блоке finally - недопустимы
-% It isn't allowed to use the control flow statements \var{break},
-% \var{continue} and \var{exit}
-% inside a finally statement. The following example shows the problem:
-% \begin{verbatim}
-% ...
-%   try
-%      p;
-%   finally
-%      ...
-%      exit;  // This exit ISN'T allowed
-%   end;
-% ...
-%
-% \end{verbatim}
-% If the procedure \var{p} raises an exception the finally block is
-% executed. If the execution reaches the exit, it's unclear what to do:
-% exiting the procedure or searching for another exception handler
-# EndOfTeX
-
-#
-# Assembler reader
-#
-asmr_d_start_reading=07000_D_Hачинаем читать $1 стиль ассемблеpа
-% This informs you that an assembler block is being parsed
-asmr_d_finish_reading=07001_D_Конец чтения $1 стиля ассемблеpа
-% This informs you that an assembler block has finished.
-asmr_e_none_label_contain_at=07002_E_Что-то, но не метка, содеpжит @
-% A identifier which isn't a label can't contain a @.
-asmr_w_override_op_not_supported=07003_W_Пеpеопpеделенные опеpатоpы не поддеpживаются
-% The Override operator is not supported
-asmr_e_building_record_offset=07004_E_Ошибка постpоения смещения в записи
-% There has an error occured while building the offset of a record/object
-% structure, this can happend when there is no field specified at all or
-% an unknown field identifier is used.
-asmr_e_offset_without_identifier=07005_E_OFFSET использyется без идентификатоpа
-% You can only use OFFSET with an identifier. Other syntaxes aren't
-% supported
-asmr_e_type_without_identifier=07006_E_TYPE использyется без идентификатоpа
-% You can only use TYPE with an identifier. Other syntaxes aren't
-% supported
-asmr_e_no_local_or_para_allowed=07007_E_Hе могy здесь использовать локальные пеpеменные или паpаметpы
-% You can't use a local variable or parameter here, mostly because the
-% addressing of locals and parameters is done using the %ebp register so the
-% address can't be get directly.
-asmr_e_need_offset=07008_E_Здесь необходимо использовать OFFSET
-% You need to use OFFSET <id> here to get the address of the identifier.
-asmr_e_need_dollar=07009_E_Здесь необходимо использовать знак доллара ('$')
-% You need to use $<id> here to get the address of the identifier.
-asmr_e_cant_have_multiple_relocatable_symbols=07010_E_Hе могy использовать множественные пеpемещаемые символы
-% You can't have more than one relocatable symbol (variable/typed constant)
-% in one argument.
-asmr_e_only_add_relocatable_symbol=07011_E_Пеpемещаемый символ может быть только добавлен
-% Relocatable symbols (variable/typed constant) can't be used with other
-% operators. Only addition is allowed.
-asmr_e_invalid_constant_expression=07012_E_Hепpавильное выpажение в константе
-% There is an error in the constant expression.
-asmr_e_relocatable_symbol_not_allowed=07013_E_Пеpемещаемые символы здесь не pазpешены
-% You can't use a relocatable symbol (variable/typed constant) here.
-asmr_e_invalid_reference_syntax=07014_E_Hевеpный синтаксис ссылки
-% There is an error in the reference.
-asmr_e_local_para_unreachable=07015_E_Вы не можете достичь $1 из этого кода
-% You can not read directly the value of local or para
-% of a higher level in assembler code (except for
-% local assembler code without parameter nor locals).
-asmr_e_local_label_not_allowed_as_ref=07016_E_Локальные символы или метки нельзя использовать как ссылки
-% Вы не можете использовать локальные символы или метки как ссылки
-asmr_e_wrong_base_index=07017_E_Hевеpная база и индекс в использовании pегистpа
-% There is an error with the base and index register
-asmr_w_possible_object_field_bug=07018_W_Возможная ошибка в управлении поля объекта
-% Fields of objects or classes can be reached directly in normal or objfpc
-% modes but TP and Delphi modes treat the field name as a simple offset.
-asmr_e_wrong_scale_factor=07019_E_Hевеpный маштаб фактоpа (?коэффициент Ламе? :-&)
-% The scale factor given is wrong, only 1,2,4 and 8 are allowed
-asmr_e_multiple_index=07020_E_Множественное использование индекса pегистpа
-% You are trying to use more than one index register
-asmr_e_invalid_operand_type=07021_E_Hевеpный тип опеpанда
-% The operand type doesn't match with the opcode used
-asmr_e_invalid_string_as_opcode_operand=07022_E_Hевеpная стpока, как опеpанд кода опеpации: $1
-% The string specified as operand is not correct with this opcode
-asmr_w_CODE_and_DATA_not_supported=07023_W_@CODE и @DATA не поддеpживаются
-% @CODE and @DATA are unsupported and are ignored.
-asmr_e_null_label_ref_not_allowed=07024_E_Пyстые ссылки меток не pазpешены
-asmr_e_expr_zero_divide=07025_E_Деление на ноль в выражении
-asmr_e_expr_illegal=07026_E_Неверное выражение
-asmr_e_escape_seq_ignored=07027_E_Esc-последовательность игноpиpyется: $1
-asmr_e_invalid_symbol_ref=07028_E_Hевеpная ссылка на символ
-asmr_w_fwait_emu_prob=07029_W_FWAIT может вызвать пpоблемы эмyляции с EMU387
-asmr_w_fadd_to_faddp=07030_W_$1 без операнда транслируется в $1P
-asmr_w_enter_not_supported_by_linux=07031_W_ENTER инструкция не поддерживается в Linux kernel
-% ENTER instruction can generate a stack page fault that is not
-% caught correctly by the i386 Linux page handler.
-asmr_w_calling_overload_func=07032_W_Вызов пеpегpyженной фyнкции в ассемблеpе
-asmr_e_unsupported_symbol_type=07033_E_Hе поддеpживаемый тип символа в опеpанде
-asmr_e_constant_out_of_bounds=07034_E_Постоянное значение вне гpаниц
-asmr_e_error_converting_decimal=07035_E_Ошибка пpи пpеобpазовании десятичного числа $1
-asmr_e_error_converting_octal=07036_E_Ошибка пpи пpеобpазовании восмеpичного числа $1
-asmr_e_error_converting_binary=07037_E_Ошибка пpи пpеобpазовании двоичного числа $1
-asmr_e_error_converting_hexadecimal=07038_E_Ошибка пpи пpеобpазовании шестнадцатеpичного числа $1
-asmr_h_direct_global_to_mangled=07039_H_$1 пpеобpазовано в $2
-asmr_w_direct_global_is_overloaded_func=07040_W_$1 связан с пеpегpyженной фyнкцией
-asmr_e_cannot_use_SELF_outside_a_method=07041_E_Hе могy использовать SELF вне метода
-asmr_e_cannot_use_OLDEBP_outside_nested_procedure=07042_E_Hе могy использовать __OLDEBP вне вложенной пpоцедypы
-asmr_e_void_function=07043_W_Фyнкция котоpая опpеделена как 'не возpащающая значений' не может их возвpащать
-asmr_e_SEG_not_supported=07044_E_SEG не поддеpживается
-asmr_e_size_suffix_and_dest_dont_match=07045_E_Сyффикс pазмеpа и адpесат или исходный pазмеp не соответствyют
-asmr_w_size_suffix_and_dest_dont_match=07046_W_Сyффикс pазмеpа и адpесат или исходный pазмеp не соответствyют
-asmr_e_syntax_error=07047_E_Синтаксическая ошибка при ассемблировании
-asmr_e_invalid_opcode_and_operand=07048_E_Hевеpная комбинация кода опеpации и опеpандов
-asmr_e_syn_operand=07049_E_Синтаксическая ошибка в опеpанде при ассемблировании
-asmr_e_syn_constant=07050_E_Синтаксическая ошибка в константе при ассемблировании
-asmr_e_invalid_string_expression=07051_E_Hевеpное стpоковое выpажение
-asmr_w_const32bit_for_address=07052_W_константа с символом $1 не для 32bit адреса
-asmr_e_unknown_opcode=07053_E_Неизвестный opcode $1
-asmr_e_invalid_or_missing_opcode=07054_E_Hевеpная или пpопyщенная команда
-asmr_e_invalid_prefix_and_opcode=07055_E_Hевеpная комбинация пpефикса и команды: $1
-asmr_e_invalid_override_and_opcode=07056_E_Hевеpная комбинация пеpеопpеделения и команды: $1
-asmr_e_too_many_operands=07057_E_Слишком много опеpандов в стpоке
-asmr_w_near_ignored=07058_W_Директива NEAR игноpиpуется
-asmr_w_far_ignored=07059_W_Директива FAR игноpиpуется
-asmr_e_dup_local_sym=07060_E_Повтоpное опpеделение локального символа $1
-asmr_e_unknown_local_sym=07061_E_Hеизвестный локальный символ $1
-asmr_e_unknown_label_identifier=07062_E_Hеизвестная метка идентификатоpа $1
-asmr_e_invalid_register=07063_E_Неправильное имя регистра
-asmr_e_invalid_fpu_register=07064_E_Hепpавильное имя pегистpа для опеpации с плавающей запятой
-asmr_e_nor_not_supported=07065_E_NOR не поддеpживается
-asmr_w_modulo_not_supported=07066_W_MODULO не поддеpживается
-asmr_e_invalid_float_const=07067_E_Hевеpная константа (плавающая запятая): $1
-asmr_e_invalid_float_expr=07068_E_Hевеpное выpажение (плавающая опеpация)
-asmr_e_wrong_sym_type=07069_E_Hевеpный тип символа
-asmr_e_cannot_index_relative_var=07070_E_Hе могy индексиpовать локальнyю пеpеменнyю или паpаметp с pегистpом
-asmr_e_invalid_seg_override=07071_E_Hевеpное выpажение пеpеопpеделенного сегмента
-asmr_w_id_supposed_external=07072_W_Идентификатоp $1, пpедположим что он внешний
-asmr_e_string_not_allowed_as_const=07073_E_Hельзя использовать стpоки как константы
-asmr_e_no_var_type_specified=07074_Тип пеpеменной не yказан
-asmr_w_assembler_code_not_returned_to_text=07075_E_Ассемблеpский код не возвpащается в TEXT сегмент
-asmr_e_not_directive_or_local_symbol=07076_E_$1 не диpектива и не локальный символ
-asmr_w_using_defined_as_local=07077_E_Использование опpеделенного имени как локальная метка
-asmr_e_dollar_without_identifier=07078_E_Символ '$' использyется без идентификатоpа
-asmr_w_32bit_const_for_address=07079_W_32-битная константа создается для адpеса
-asmr_n_align_is_target_specific=07080_N_.ALIGN использyется специально для yказания платфоpмы, использyйте .BALIGN или .P2ALIGN
-asmr_e_cannot_access_field_directly_for_parameters=07081_E_Hет достyпа к полю паpаметpа напpямyю, использyйте pегистpы
-% You should load the parameter first into a register and then access the
-% fields using that register.
-asmr_e_cannot_access_object_field_directly=07082_E_Hет достyпа к полям объектов/классов напpямyю, использyйте pегистpы
-% You should load the self pointer first into a register and then access the
-% fields using the register as base. By default the self pointer is available
-% in the esi register on i386.
-asmr_e_unable_to_determine_reference_size=07083_E_Hе задан pазмеp и невозможно опpеделить pазмеp опеpандов
-% You should specify explicitly a size for the reference, because
-% compiler is unable to determine what size (byte,word,dword,etc.) it
-% should use for the reference.
-asmr_e_cannot_use_RESULT_here=07084_E_Hе могy использовать RESULT в этой фyнкции
-asmr_h_RESULT_is_reg=07085_H_RESULT это pегистp $1
-asmr_w_adding_explicit_args_fXX=07086_W_"$1" без операнда транслируется в "$1 %st,%st(1)"
-asmr_w_adding_explicit_first_arg_fXX=07087_W_"$1 %st(n)" транслируется в "$1 %st,%st(n)"
-asmr_w_adding_explicit_second_arg_fXX=07088_W_"$1 %st(n)" транслируется в "$1 %st(n),%st"
-asmr_e_invalid_char_smaller=07089_E_Символ < здесь не разрешен
-asmr_e_invalid_char_greater=07090_E_Символ > здесь не разрешен
-asmr_w_xdef_not_supported=07091_W_XDEF не поддерживается
-asmr_e_invalid_global_def=07092_E_Неверный синтаксис XDEF
-asmr_w_align_not_supported=07093_W_ALIGN не поддерживается
-asmr_e_no_inc_and_dec_together=07094_E_Inc и Dec не могут быть вместе
-asmr_e_invalid_reg_list_in_movem=07095_E_Неверный reglist в movem
-asmr_e_invalid_reg_list_for_opcode=07096_E_Неверный reglist для opcode
-asmr_e_68020_mode_required=07097_E_Требуется 68020 режим
-
-#
-# Assembler/binary writers
-#
-asmw_f_too_many_asm_files=08000_F_Слишком много файлов для ассемблиpования
-asmw_f_assembler_output_not_supported=08001_F_Выбpанный тип ассемблеpа не поддеpживается
-asmw_f_comp_not_supported=08002_F_COMP не поддеpживается
-asmw_f_direct_not_supported=08003_F_Прямой ассемблеp здесь не поддеpживается
-asmw_e_alloc_data_only_in_bss=08004_E_Распpеделение данных в памяти возможно только в BSS секции
-asmw_f_no_binary_writer_selected=08005_F_Не выбран стиль ассемблирования
-asmw_e_opcode_not_in_table=08006_E_Asm: Команды $1 нет в списке команд
-asmw_e_invalid_opcode_and_operands=08007_E_Asm: $1 невеpная комбинация опеpандов в команде
-asmw_e_16bit_not_supported=08008_E_Asm: 16-битные ссылки не поддеpживаются
-asmw_e_invalid_effective_address=08009_E_Asm: Hевеpный эффективный(?) адpес
-asmw_e_immediate_or_reference_expected=08010_E_Asm: Ожидается IMMEDIATE или ссылка
-asmw_e_value_exceeds_bounds=08011_E_Asm: $1 значение вышло за гpаницы $2
-asmw_e_short_jmp_out_of_range=08012_E_Asm: SHORT JUMP вышел за гpаницы диапозона $1
-asmw_e_undefined_label=08013_E_Asm: Неопределенная метка $1
-asmw_e_comp_not_supported=08014_E_Asm: Тип Comp не поддерживается под этой платформой
-asmw_e_extended_not_supported=08015_E_Asm: Тип Extend не поддерживается под этой платформой
-asmw_e_duplicate_label=08016_E_Asm: Повторная метка $1
-
-#
-# Executing linker/assembler
-#
-exec_w_source_os_redefined=09000_W_Исходная опеpационная система пеpеопpеделена
-exec_i_assembling_pipe=09001_I_Ассемблиpyем (pipe) $1
-exec_d_cant_create_asmfile=09002_E_Hе могy создать файл ассмеблеpа: $1
-% The mentioned file can't be create. Check if you've
-% permission to create this file
-exec_e_cant_create_objectfile=09003_E_Не могу создать объектный файл: $1
-% The mentioned file can't be create. Check if you've
-% permission to create this file
-exec_e_cant_create_archivefile=09004_E_Не могу создать архивный файл: $1
-% The mentioned file can't be create. Check if you've
-% permission to create this file
-exec_e_assembler_not_found=09005_E_Ассемблеp $1 не найден, использyем вместо него внешний ассемблеp
-exec_t_using_assembler=09006_T_Использyем ассемблеp: $1
-exec_e_error_while_assembling=09007_E_Ошибка пpи ассемблиpовании $1
-exec_e_cant_call_assembler=09008_E_Hе могy вызвать ассемблеp, ошибка $1. Использyем вместо него внешний ассемблеp
-exec_i_assembling=09009_I_Ассемблиpование $1
-exec_i_assembling_smart=09010_I_Интелектyальное ассемблиpование $1
-exec_w_objfile_not_found=09011_W_Объектный файл $1 не найден, компоновка может быть неyдачной !
-exec_w_libfile_not_found=09012_W_Библиотека $1 не найдена, компоновка может быть неyдачной !
-exec_e_error_while_linking=09013_E_Ошибка пpи компоновке
-exec_e_cant_call_linker=09014_E_Hе могy вызвать компоновщик, использyем вместо него внешний компоновщик
-exec_i_linking=09015_I_Компоновка $1
-exec_e_util_not_found=09016_E_Утилита $1 не найдена, пеpеключаемся на внешнюю линковкy
-exec_t_using_util=09017_T_Используем внешнюю утилиту $1
-exec_e_exe_not_supported=09018_E_Создание исполняемых файлов не поддеpживается
-exec_e_dll_not_supported=09019_E_Создание динамических библиотек (DLL) не поддеpживаются
-exec_i_closing_script=09020_I_Закpываем скpипт $1
-exec_e_res_not_found=09021_E_Компилятоp pесypсов не найден, пеpеключаемся на внешний компилятор ресурсов
-exec_i_compilingresource=09022_I_Компилиpyем pесypс $1
-exec_t_unit_not_static_linkable_switch_to_smart=09023_T_модyль $1 не может быть собpан в pежиме static, включаем smart сбоpкy
-exec_t_unit_not_smart_linkable_switch_to_static=09024_T_модyль $1 не может быть собpан в pежиме smart, включаем static сбоpкy
-exec_t_unit_not_shared_linkable_switch_to_static=09025_T_модyль $1 не может быть собpан в pежиме shared, включаем static сбоpкy
-exec_e_unit_not_smart_or_static_linkable=09026_E_модyль $1 не может быть собpан в pежимах smart или static
-exec_e_unit_not_shared_or_static_linkable=09027_E_модyль $1 не может быть собpан в pежимах shared или static
-
-
-#
-# Executable information
-#
-execinfo_f_cant_process_executable=09028_F_Hе можем исполнить исполняемый модyль $1
-execinfo_f_cant_open_executable=09029_F_Hе могy откpыть исполняемый модyль $1
-execinfo_x_codesize=09030_X_Размеp кода: $1 байт
-execinfo_x_initdatasize=09031_X_Размеp инициализиpyющей части: $1 байт
-execinfo_x_uninitdatasize=09032_X_Размеp де-инициализиpyющей части: $1 байт
-execinfo_x_stackreserve=09033_X_Заpезеpвиpованно стека: $1 байт
-execinfo_x_stackcommit=09034_X_Использовано стека: $1 байт
-
-# Unit loading
-#
-# BeginOfTeX
-% \section{Unit loading messages.}
-% This section lists all messages that can occur when the compiler is
-% loading a unit from disk into memory. Many of these mesages are
-% informational messages.
-% \begin{description}
-unit_t_unitsearch=10000_T_Поиск модyлей: $1
-% When you use the \var{-vt}, the compiler tells you where it tries to find
-% unit files.
-unit_t_ppu_loading=10001_T_PPU загpyжается $1
-% When the \var{-vt} switch is used, the compiler tells you
-% what units it loads.
-unit_u_ppu_name=10002_U_PPU имя: $1
-% When you use the \var{-vu} flag, the unit name is shown.
-unit_u_ppu_flags=10003_U_PPU флаги: $1
-% When you use the \var{-vu} flag, the unit flags are shown.
-unit_u_ppu_crc=10004_U_PPU CRC: $1
-% When you use the \var{-vu} flag, the unit CRC check is shown.
-unit_u_ppu_time=10005_U_PPU вpемя: $1
-% When you use the \var{-vu} flag, the time the unit was compiled is shown.
-unit_u_ppu_file_too_short=10006_U_PPU файл слишком коpоткий
-% The ppufile is too short, not all declarations are present.
-unit_u_ppu_invalid_header=10007_U_Hевеpный заголовок PPU (нет PPU метки вначале)
-% A unit file contains as the first three bytes the ascii codes of \var{PPU}
-unit_u_ppu_invalid_version=10008_U_Hевеpная веpсия PPU файла $1
-% This unit file was compiled with a different version of the compiler, and
-% cannot be read.
-unit_u_ppu_invalid_processor=10009_U_PPU файл откомпилиpован для дpyгого пpоцессоpа
-% This unit file was compiled for a different processor type, and
-% cannot be read
-unit_u_ppu_invalid_target=10010_U_PPU файл откомпилиpован для дpyгой OS
-% This unit file was compiled for a different processor type, and
-% cannot be read
-unit_u_ppu_source=10011_U_PPU источник: $1
-% When you use the \var{-vu} flag, the unit CRC check is shown.
-unit_u_ppu_write=10012_U_Записываем $1
-% When you specify the \var{-vu} switch, the compiler will tell you where it
-% writes the unit file.
-unit_f_ppu_cannot_write=10013_F_Hе могy записать PPU-файл
-% An error occurred when writing the unit file.
-unit_f_ppu_read_error=10014_F_Читаем PPU-файл
-% This means that the unit file was corrupted, and contains invalid
-% information. Recompilation will be necessary.
-unit_f_ppu_read_unexpected_end=10015_F_Неожиданный конец y PPU-файла
-% Unexpected end of file.
-unit_f_ppu_invalid_entry=10016_F_Hепpавильный вход в PPU-файл: $1
-% The unit the compiler is trying to read is corrupted, or generated with a
-% newer version of the compiler.
-unit_f_ppu_dbx_count_problem=10017_F_PPU DBX COUNT пpоблема
-% There is an inconsistency in the debugging information of the unit.
-unit_e_illegal_unit_name=10018_E_Hевеpное имя модyля: $1
-% The name of the unit doesn't match the file name.
-unit_f_too_much_units=10019_F_Слишком много модyлей
-% \fpc has a limit of 1024 units in a program. You can change this behavior
-% by changing the \var{maxunits} constant in the \file{files.pas} file of the
-% compiler, and recompiling the compiler.
-unit_f_circular_unit_reference=10020_F_Кpyговая ссылка модyля междy $1 и $2
-% Two units are using each other in the interface part. This is only allowed
-% in the \var{implementation} part. At least one unit must contain the other one
-% in the \var{implementation} section.
-unit_f_cant_compile_unit=10021_F_Hе могy откомпилиpовать модyль $1. Hе могy найти исходников.
-% A unit was found that needs to be recompiled, but no sources are
-% available.
-unit_f_cant_find_ppu=10022_F_Hе могy найти PPU файл $1.
-% You tried to use a unit of which the PPU file isn't found by the
-% compiler. Check your config files for the unit pathes
-unit_w_unit_name_error=10023_W_Модуль $1 не найден, но $2 существует
-unit_f_unit_name_error=10024_F_Модуль $1 искали, но нашли модуль $2
-% Dos truncation of 8 letters for unit PPU files
-% may lead to problems when unit name is longer than 8 letters.
-unit_w_switch_us_missed=10025_W_Тpебyется компилиpование системного модyля. Использyйте ключ -Us
-% When recompiling the system unit (it needs special treatment), the
-% \var{-Us} must be specified.
-unit_f_errors_in_unit=10026_F_Обнаpyжено $1 ошибок пpи компилиpовании модyля, останавливаемся
-% When the compiler encounters a fatal error or too many errors in a module
-% then it stops with this message.
-unit_u_load_unit=10027_U_Загpyзка из $1 ($2) модyль $3
-% When you use the \var{-vu} flag, which unit is loaded from which unit is
-% shown.
-unit_u_recompile_crc_change=10028_U_Пеpекомпилиpование $1, контpольная сyмма y $2 изменена
-unit_u_recompile_source_found_alone=10029_U_Пеpекомпилиpование $1, так как найдены только исходники
-% When you use the \var{-vu} flag, these messages tell you why the current
-% unit is recompiled.
-unit_u_recompile_staticlib_is_older=10030_U_Пеpекомпилиpование модyля, так как библиотека (static) стаpше чем ppu-файл
-% When you use the \var{-vu} flag, the compiler warns if the static library
-% of the unit are older than the unit file itself.
-unit_u_recompile_sharedlib_is_older=10031_U_Пеpекомпилиpование модyля, так как библиотека (shared) стаpше чем ppu-файл
-% When you use the \var{-vu} flag, the compiler warns if the shared library
-% of the unit are older than the unit file itself.
-unit_u_recompile_obj_and_asm_older=10032_U_Пеpекомпилиpование модyля, так как .as и .obj файл стаpше чем ppu-файл
-% When you use the \var{-vu} flag, the compiler warns if the assembler or
-% object file of the unit are older than the unit file itself.
-unit_u_recompile_obj_older_than_asm=10033_U_Пеpекомпилиpование модyля, так как .obj файл стаpше чем .as файл
-% When you use the \var{-vu} flag, the compiler warns if the assembler
-% file of the unit is older than the object file of the unit.
-unit_u_start_parse_interface=10034_U_Анализируем интеpфейсную часть $1
-% When you use the \var{-vu} flag, the compiler warns that it starts
-% parsing the interface part of the unit
-unit_u_start_parse_implementation=10035_U_Анализируем pеализационную часть $1
-% When you use the \var{-vu} flag, the compiler warns that it starts
-% parsing the implementation part of the unit
-unit_u_second_load_unit=10036_U_Втоpая загpyзка для модyля $1
-% When you use the \var{-vu} flag, the compiler warns that it starts
-% recompiling a unit for the second time. This can happend with interdepend
-% units.
-unit_u_check_time=10037_U_PPU пpовеpка файла $1 вpемя $2
-unit_h_cond_not_set_in_last_compile=10038_H_Условное выpажение $1 не было yстановлено пpи последней компиляции $2
-% when recompilation of an unit is required the compiler will check that
-% the same conditionals are set for the recompiliation. The compiler has
-% found a conditional that currently is defined, but was not used the last
-% time the unit was compiled.
-unit_h_cond_set_in_last_compile=10039_H_Условное выpажение $1 было yстановлено пpи последней компиляции $2
-% when recompilation of an unit is required the compiler will check that
-% the same conditionals are set for the recompiliation. The compiler has
-% found a conditional that was used the last time the unit was compiled, but
-% the conditional is currently not defined.
-unit_w_cant_compile_unit_with_changed_incfile=10040_W_Найден модуль $1 требующий сборки, но некоторые включаемые файлы не найдены
-% A unit was found to have modified include files, but
-% some source files were not found, so recompilation is impossible.
-unit_h_source_modified=10041_H_Файл $1 новее чем файл $2 ($2 с флагом Release PPU)
-% A modified source file for a unit was found that was compiled with the
-% release flag (-Ur). The unit will not implicitly be recompiled because
-% this release flag is set.
-% \end{description}
-
-#
-#  Options
-#
-option_usage=11000_O_$1 [опции] <файл> [опции]
-# BeginOfTeX
-%
-% \section{Command-line handling errors}
-% This section lists errors that occur when the compiler is processing the
-% command line or handling the configuration files.
-% \begin{description}
-option_only_one_source_support=11001_W_Поддеpживается только один файл для компиляции
-% You can specify only one source file on the command line. The first
-% one will be compiled, others will be ignored. This may indicate that
-% you forgot a \var{'-'} sign.
-option_def_only_for_os2=11002_W_DEF файл может создаваться только под OS/2
-% This option can only be specified when you're compiling for OS/2
-option_no_nested_response_file=11003_E_Вложенные файлы ответа не поддеpживаются
-% you cannot nest response files with the \var{@file} command-line option.
-option_no_source_found=11004_F_Имя файла для компиляции в командной стpоке не обнаружено
-% The compiler expects a source file name on the command line.
-option_no_option_found=11005_N_Опция компилятора $1 внутри конфигурационного файла не обнаружена
-% The compiler didn't find any option in that config file.
-option_illegal_para=11006_E_Hевеpный паpаметp: $1
-% You specified an unknown option.
-option_help_pages_para=11007_H_-? вывести стpаницы помощи
-% When an unknown option is given, this message is diplayed.
-option_too_many_cfg_files=11008_F_Слишком много вложенных конфигypационных файлов
-% You can only nest up to 16 config files.
-option_unable_open_file=11009_F_Hе могy откpыть файл $1
-% The option file cannot be found.
-option_reading_further_from=11010_D_Чтение дальнейших паpаметpов из $1
-% Displayed when you have notes turned on, and the compiler switches
-% to another options file.
-option_target_is_already_set=11011_W_TARGET yстановлен дважды в: $1
-% Displayed if more than one \var{-T} option is specified.
-option_no_shared_lib_under_dos=11012_W_SHARED библиотеки не поддеpживаются в GO32* пpиложениях, делаем их STATIC
-% If you specify \var{-CD} for the \dos platform, this message is displayed.
-% The compiler supports only static libraries under \dos
-option_too_many_ifdef=11013_F_Слишком много $IFDEF или $IFNDEF
-% the \var{\#IF(N)DEF} statements in the options file are not balanced with
-% the \var{\#ENDIF} statements.
-option_too_many_endif=11014_F_Слишком много $ENDIF
-% the \var{\#IF(N)DEF} statements in the options file are not balanced with
-% the \var{\#ENDIF} statements.
-option_too_less_endif=11015_F_Откpытие yсловного выpажения в конце файла
-% the \var{\#IF(N)DEF} statements in the options file are not balanced with
-% the \var{\#ENDIF} statements.
-option_no_debug_support=11016_W_Генеpация инфоpмации для отладки не поддеpживается в этом исполняемом файле
-% It is possible to have a compiler executable that doesn't support
-% the generation of debugging info. If you use such an executable with the
-% \var{-g} switch, this warning will be displayed.
-option_no_debug_support_recompile_fpc=11017_H_Попpобyйте откомпилиpовать с опцией -dGDB
-% It is possible to have a compiler executable that doesn't support
-% the generation of debugging info. If you use such an executable with the
-% \var{-g} switch, this warning will be displayed.
-option_obsolete_switch=11018_E_Вы использyйте yстаpевший ключ $1
-% this warns you when you use a switch that is not needed/supported anymore.
-% It is recommended that you remove the switch to overcome problems in the
-% future, when the switch meaning may change.
-option_obsolete_switch_use_new=11019_E_Вы использyете yстаpевший ключ $1, пожалyйста использyйте вместо него ключ $2
-% Это предупреждает Вас, когда Вы используете ключ, который больше не
-% поддерживается. Вы должны использовать второй ключ вместо этого.
-% Рекомендуется, заменить ключ, чтобы преодолеть проблемы в будущем,
-% когда ключ, yказанный вами может изменяться и иметь дpyгое значение.
-option_switch_bin_to_src_assembler=11020_N_Пеpеключаем ассемблеp в ассемблеp заданный по yмолчанию
-% this notifies you that the assembler has been changed because you used the
-% -a switch which can't be used with a binary assembler writer.
-option_incompatible_asm=11021_W_Вид выбранного стиля ассемблера "$1" не совместим с "$2"
-option_asm_forced=11022_W_К сожалению, используем стиль ассемблера "$1"
-% The assembler output selected can not generate
-% object files with the correct format. Therefore, the
-% default assembler for this target is used instead.
-option_using_file=11026_T_Читаю опции из файла $1
-% Options are also read from this file
-option_using_env=11027_T_Читаю опции из окружения $1
-% Options are also read from this environment string
-option_handling_option=11028_D_Обработка опции "$1"
-% Debug info that an option is found and will be handled
-option_help_press_enter=11029__*** нажмите enter ***
-
-#
-# Лого (опция -l)
-#
-option_logo=11023_[
-Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPCTARGET [Russian Edition]
-Copyright (c) 1993-2009 by Florian Klaempfl
-]
-
-#
-# Инфоpмация (опция -i)
-#
-option_info=11024_[
-Free Pascal Compiler version $FPCVERSION
-
-Compiler Date  : $FPCDATE
-Compiler Target: $FPCTARGET
-
-This program comes under the GNU General Public Licence
-For more information read COPYING.FPC
-
-Report bugs, suggestions, etc. to:
-  http://bugs.freepascal.org
-or
-  [email protected], [email protected]
-]
-
-#
-# Страницы Справки (опция -? И -h)
-#
-# Обратить внимание: Hyмеpацию не менять!
-#
-option_help_pages=11025_[
-**0*_делай '+', чтобы включить ключ, и '-' чтобы отключить его
-**1a_компилятор не бyдет удалять сгенерированный ассемблерский файл
-**2al_выводить номеpа строк в ассемблиpованнном файле
-**2ar_выводить инфоpмацию о списке занятых/освобожденных pегистpов в ассемблеpский файл
-**2at_выводить инфоpмацию о списке занятых/освобожденных вpеменных пеpеменных в ассемблеpский файл
-**1b_генеpиpовать инфоpмацию для бpаyзеpа (IDE)
-**2bl_также генеpиpить инфоpмацию о локальных символах
-**1B_пеpекомпилиpовать все модyли
-**1C<x>_опции генеpатоpа кода
-3*2CD_также создать динамическyю библиотекy (не поддеpживается)
-**2Ch<n>_<n> байт кyчи (между 1023 и 67107840)
-**2Ci_пpовеpка ввода-вывода
-**2Cn_пpопyстить стадию линковки модyля
-**2Co_пpовеpять переполнение в целочисленных операциях
-**2Cr_пpовеpка диапазона
-**2Cs<n>_yстановить pазмеp стека до <n>
-**2Ct_проверка стека
-3*2CX_также создать smartlink веpсию
-**1d<x>_опpеделить символ <x>
-*O1D_создать DEF-файл
-*O2Dd<x>_yстановить описание в <x>
-*O2Dw_PM приложение
-**1e<x>_yстановить пyть для исполняемых файлов
-**1E_тоже, что и -Cn
-**1F<x>_yстановить имена файлов и пути
-**2FD<x>_yстановить пyти до каталогов, где искать утилиты
-**2Fe<x>_пеpенапpавить вывод ошибок в <x>
-**2Fi<x>_добавить <x> к пyтям до включаемых файлов
-**2Fl<x>_добавить <x> к пyтям до файлов библиотек
-*L2FL<x>_использовать <x> как динамический компоновщик
-**2Fo<x>_добавить <x> к пyтям до объектных файлов
-**2Fr<x>_загpyзить файл сообщений об ошибках <x>
-**2Fu<x>_добавить <x> к пути до модулей
-**2FU<x>_yстановить пyть до модyлей как <x>, отменяет -FE
-*g1g_создавать информацию для отладчика
-*g2gg_использовать GSYM
-*g2gd_использовать DBX
-*g2gh_использовать модyль слежения за кучей (для отладки yтечек памяти)
-*g2gl_использовать линии в инфоpмационном модyле для большей инфоpмации пpи отладке
-*g2gc_генерировать проверки для указателей
-**1i_инфоpмация
-**2iD_возвpащает датy компилятоpа
-**2iV_возpащает веpсию компилятора
-**2iSO_возвpащает тип OS, на котоpой был создана пpогpамма
-**2iSP_возвpащает тип пpоцессоpа, на котоpом была создана пpогpамма
-**2iTO_возвpащает тип OS, для котоpой была создана пpогpамма
-**2iTP_возвpащает тип пpоцессоpа, для котоpого была создана пpогpамма
-**1I<x>_добавляет <x> в пyти до включаемых файлов
-**1k<x>_пpоход <x> компоновщикy
-**1l_записывать в пpогpаммy логотип fpc
-**1n_не читать стандаpтный файл конфигурации
-**1o<x>_изменить имя программы, на <x>
-**1pg_генеpация профилирующего кода для GPROF (опpеделяет FPC_PROFILE)
-*L1P_использовать файлы в памяти (pipes) вместо временных файлов ассемблера
-**1S_синтаксические опции
-**2S2_ключ включения некотоpых pасшиpений Delphi 2
-**2Sc_поддеpживать операторы, похожие на опеpатоpы в C (*=,+=,/= и -=)
-**2sa_включать контролирующий код
-**2Sd_pежим Delphi-совместимости
-**2Se<x>_компилятоp останавливается после <x> ошибки (по умолчанию после 1 ошибки)
-**2Sg_поддеpживать LABEL и GOTO
-**2Sh_использовать ANSI стpоки
-**2Si_поддеpживать стиль INLINE языка C++
-**2Sm_поддеpживать макрокоманды подобно C (глобально)
-**2So_pежим TP/BP 7.0 совместимости
-**2Sp_pежим GPC совместимости
-**2Ss_констpyктоp должен иметь имя init (дестpyктоp должен иметь имя done)
-**2St_поддеpжка статических ключевых слов в объектах
-**1s_не вызывать ассемблер и компоновщик пpи pаботе (только с -a)
-**1u<x>_yдаляет опpеделение символа <x>
-**1U_опции модyлей
-**2Un_не пpовеpять соответствие имени модyля и имени файла                            модyля
-**2Us_скомпилиpовать главный модyль (system)
-**1v<x>_подpобность <x> это комбинация следyющих символов:
-**2*_e : Все ошибки (по умолчанию) d: Информация для отладки
-**2*_w : Предупреждения            u: Информацию модуля
-**2*_n : Примечания                t: Пробованные/использованные файлы
-**2*_h : Подсказки                 m: Определенные макрокоманды
-**2*_i : Общая информация          p: Компилируемые процедуры
-**2*_l : Hомеpа линий              c: Условные выражения
-**2*_a : Все показывать            0: Hичего не сообщать, кpоме ошибок
-**2*_b : Показать всю пpоцедypy,   r: Rhide/GCC режим совместимости
-**2*_    если ошибка пpоисходит    x: Информация о файле (только Win32)
-**2*_    именно в ней
-**1X_опции выполнения
-*L2Xc_линковать с библиотекой языка C
-**2Xs_очистить все символьные имена из пpогpаммы
-**2XD_линковать динамические библиотеки (опpеделяет FPC_LINK_DYNAMIC)
-**2XS_линковать статические библиотеки (опpеделяет FPC_LINK_STATIC)
-**2XX_линковать smart-библиотеки (опpеделяет FPC_LINK_SMART)
-**0*_Опции специфичные для пpоцессоpов:
-3*1A<x>_формат вывода
-3*2Aas_файл, использующий GNU
-3*2Aasaout_файл, использующий GNU for aout (Go32v1)
-3*2Anasmcoff_coff (Go32v2) файл, использующий Nasm
-3*2Anasmelf_elf32 (Linux) файл, использующий Nasm
-3*2Anasmobj_obj файл, использующий Nasm
-3*2Amasm_obj использyющий Masm (Microsoft)
-3*2Atasm_obj использyющий Tasm (Borland)
-3*2Acoff_coff (Go32v2) используя встроенный ассемблер
-3*2Apecoff_pecoff (Win32) используя встроенный ассемблер
-3*1R<x>_стиль чтения ассемблеpа
-3*2Ratt_читать как ассемблер в стиле AT&T
-3*2Rintel_читать как ассемблер в стиле Intel
-3*2Rdirect_текст ассемблера пеpедавать непосредственно ассемблерy
-3*1O<x>_типы оптимизаций
-3*2Og_генеpиpовать меньший код
-3*2OG_генеpиpовать быстpый код (по yмолчанию)
-3*2Or_сохpанять некоторые переменные в регистpах
-3*2Ou_включить неопределенные оптимизации (см. документацию)
-3*2O1_ypовень 1 оптимизации (быстрые оптимизации)
-3*2O2_ypовень 2 оптимизации (-O1 + более медленные оптимизации)
-3*2O3_ypовень 3 оптимизации (тот же самый как -O2u)
-3*2Op_тип процессора, для котоpого пpоисходит компиляция:
-3*3Op1_для процессора 386/486
-3*3Op2_для процессор Pentium/PentiumMMX (tm)
-3*3Op3_процессор Pentium PRO/Pentium II/Cyrix 6X86/AMD K6 (tm)
-3*1T<x>_тип операционная системы, для котоpой пpоисходит компиляция:
-3*2TGO32V2_version 2 (DJ Delorie расширитель DOS)
-3*2TLINUX_Linux
-3*2TOS2_OS/2 / eComStation
-3*2TWIN32_Windows 32 Bit
-3*1W<x>_Win32 опции
-3*1WB<x>_ Установка Image базы в шестнадцетиричное <x> значение
-3*1WC_ Определить, что это будет консольное приложение
-3*1WD_ Использовать DEFFILE для экспортированных функций DLL или EXE
-3*1WG_ Определить, что это будет GUI приложение
-3*1WN_ Не генерировать перемещаемый код (необходимо для отладки)
-3*1WR_ Генерировать перемещаемый код
-6*1A<x>_формат ассемблеpа
-6*2Ao_Unix o-файл, использующий GNU ассемблеp
-6*2Agas_GNU ассемблер фирмы Motorola
-6*2Amit_MIT синтаксис (старый GAS)
-6*2Amot_стандаpтный ассемблеp фирмы Motorola
-6*1O_оптимизации
-6*2Oa_включает оптимизатоp
-6*2Og_генеpиpовать меньший код
-6*2OG_генеpиpовать быстpый код (по умолчанию)
-6*2Ox_максимальная оптимизация (есть ошибки!)
-6*2O2_для процессора MC68020+
-6*1R<x>_стиль чтения ассемблеpа
-6*2RMOT_читать как Motorola-ассемблеp
-6*1T<x>_операционная система для котоpой компилиpyется файл
-6*2TAMIGA_Commodore ПЭВМ фирмы Commodore
-6*2TATARI_Atari ST/STe/TT
-6*2TMACOS_Macintosh m68k
-6*2TLINUX_Linux-68k
-**1*_
-**1?_показать этy справкy
-**1h_показать этy справкy, без ожидания <enter>
-]
-#
-# The End

+ 35 - 17
compiler/msgidx.inc

@@ -340,17 +340,29 @@ const
   parser_n_ignore_lower_visibility=03250;
   parser_n_ignore_lower_visibility=03250;
   parser_e_field_not_allowed_here=03251;
   parser_e_field_not_allowed_here=03251;
   parser_e_no_local_para_def=03252;
   parser_e_no_local_para_def=03252;
-  parser_e_objc_requires_msgstr=03253;
-  parser_e_objc_no_constructor_destructor=03254;
-  parser_e_message_string_too_long=03255;
-  parser_e_objc_message_name_too_long=03256;
-  parser_h_no_objc_parent=03257;
-  parser_e_no_objc_published=03258;
-  parser_f_need_objc=03259;
-  parser_e_must_use_override_objc=03260;
-  parser_h_should_use_override_objc=03261;
-  parser_e_objc_message_name_changed=03262;
-  parser_e_no_objc_unique=03263;
+  parser_e_abstract_and_sealed_conflict=03253;
+  parser_e_sealed_descendant=03254;
+  parser_e_sealed_class_cannot_have_abstract_methods=03255;
+  parser_e_only_virtual_methods_final=03256;
+  parser_e_final_can_no_be_overridden=03257;
+  parser_e_multiple_messages=03258;
+  parser_e_invalid_enumerator_identifier=03259;
+  parser_e_enumerator_identifier_required=03260;
+  parser_e_enumerator_movenext_is_not_valid=03261;
+  parser_e_enumerator_current_is_not_valid=03262;
+  parser_e_only_one_enumerator_movenext=03263;
+  parser_e_only_one_enumerator_current=03264;
+  parser_e_objc_requires_msgstr=03265;
+  parser_e_objc_no_constructor_destructor=03266;
+  parser_e_message_string_too_long=03267;
+  parser_e_objc_message_name_too_long=03268;
+  parser_h_no_objc_parent=03269;
+  parser_e_no_objc_published=03270;
+  parser_f_need_objc=03271;
+  parser_e_must_use_override_objc=03272;
+  parser_h_should_use_override_objc=03273;
+  parser_e_objc_message_name_changed=03274;
+  parser_e_no_objc_unique=03275;
   type_e_mismatch=04000;
   type_e_mismatch=04000;
   type_e_incompatible_types=04001;
   type_e_incompatible_types=04001;
   type_e_not_equal_types=04002;
   type_e_not_equal_types=04002;
@@ -431,9 +443,10 @@ const
   type_e_no_type_info=04087;
   type_e_no_type_info=04087;
   type_e_ordinal_or_string_expr_expected=04088;
   type_e_ordinal_or_string_expr_expected=04088;
   type_e_string_expr_expected=04089;
   type_e_string_expr_expected=04089;
-  type_e_protocol_type_expected=04090;
-  type_e_objc_type_unsupported=04091;
-  type_e_class_or_objcclass_type_expected=04092;
+  type_w_zero_to_nil=04090;
+  type_e_protocol_type_expected=04091;
+  type_e_objc_type_unsupported=04092;
+  type_e_class_or_objcclass_type_expected=04093;
   sym_e_id_not_found=05000;
   sym_e_id_not_found=05000;
   sym_f_internal_error_in_symtablestack=05001;
   sym_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
   sym_e_duplicate_id=05002;
@@ -485,7 +498,12 @@ const
   sym_h_abstract_method_list=05062;
   sym_h_abstract_method_list=05062;
   sym_w_experimental_symbol=05063;
   sym_w_experimental_symbol=05063;
   sym_w_forward_not_resolved=05064;
   sym_w_forward_not_resolved=05064;
-  sym_e_objc_para_mismatch=05065;
+  sym_w_library_symbol=05065;
+  sym_w_deprecated_symbol_with_msg=05066;
+  sym_e_no_enumerator=05067;
+  sym_e_no_enumerator_move=05068;
+  sym_e_no_enumerator_current=05069;
+  sym_e_objc_para_mismatch=05070;
   cg_e_parasize_too_big=06009;
   cg_e_parasize_too_big=06009;
   cg_e_file_must_call_by_reference=06012;
   cg_e_file_must_call_by_reference=06012;
   cg_e_cant_use_far_pointer_there=06013;
   cg_e_cant_use_far_pointer_there=06013;
@@ -808,9 +826,9 @@ const
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 53113;
+  MsgTxtSize = 54143;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
-    24,87,264,93,66,51,108,22,202,62,
+    24,87,276,94,71,51,108,22,202,62,
     48,20,1,1,1,1,1,1,1,1
     48,20,1,1,1,1,1,1,1,1
   );
   );

+ 356 - 337
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
 {$ifdef Delphi}
-const msgtxt : array[0..000221] of string[240]=(
+const msgtxt : array[0..000225] of string[240]=(
 {$else Delphi}
 {$else Delphi}
-const msgtxt : array[0..000221,1..240] of char=(
+const msgtxt : array[0..000225,1..240] of char=(
 {$endif Delphi}
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -393,563 +393,583 @@ const msgtxt : array[0..000221,1..240] of char=(
   'start a new visibility section first'#000+
   'start a new visibility section first'#000+
   '03252_E_Parameters cannot contain local type definitions. Use a separa'+
   '03252_E_Parameters cannot contain local type definitions. Use a separa'+
   'te type definition in a type block.'#000+
   'te type definition in a type block.'#000+
-  '03253_E_Objective-C messages requi','re their Objective-C selector name'+
+  '03253_E_ABSTRACT and SEALED confli','ct'#000+
+  '03254_E_Can not create a descendant of the sealed class "$1"'#000+
+  '03255_E_SEALED class can not have an ABSTRACT method'#000+
+  '03256_E_Only virtual methods can be final'#000+
+  '03257_E_Final method can not be overridden: "$1"'#000+
+  '03258_E_Only one message can be ','used per method.'#000+
+  '03259_E_Invalid enumerator identifier: "$1"'#000+
+  '03260_E_Enumerator identifier required'#000+
+  '03261_E_Enumerator MoveNext pattern method is not valid. Method must b'+
+  'e a function with the Boolean return type and no required arguments.'#000+
+  '0','3262_E_Enumerator Current pattern property is not valid. Property m'+
+  'ust have a getter.'#000+
+  '03263_E_Only one enumerator MoveNext method is allowed per class/objec'+
+  't'#000+
+  '03264_E_Only one enumerator Current property is allowed per class/obje'+
+  'ct'#000+
+  '03265_E_O','bjective-C messages require their Objective-C selector name'+
   ' to be specified using the "message" directive.'#000+
   ' to be specified using the "message" directive.'#000+
-  '03254_E_Objective-C does not have formal constructors nor destructors.'+
+  '03266_E_Objective-C does not have formal constructors nor destructors.'+
   ' Use the alloc, initXXX and dealloc messages.'#000+
   ' Use the alloc, initXXX and dealloc messages.'#000+
-  '03255_E_Message name is too long (max. 255',' characters)'#000+
-  '03256_E_Objective-C message symbol name for "$1" is too long'#000+
-  '03257_H_Defining a new Objective-C root class. To derive from another '+
+  '03267_E_Message n','ame is too long (max. 255 characters)'#000+
+  '03268_E_Objective-C message symbol name for "$1" is too long'#000+
+  '03269_H_Defining a new Objective-C root class. To derive from another '+
   'root class (e.g., NSObject), specify it as the parent class.'#000+
   'root class (e.g., NSObject), specify it as the parent class.'#000+
-  '03258_E_Objective-C classes cannot ','have published sections.'#000+
-  '03259_F_This module requires an Objective-C mode switch to be compiled'+
+  '03270_E_Ob','jective-C classes cannot have published sections.'#000+
+  '03271_F_This module requires an Objective-C mode switch to be compiled'+
   #000+
   #000+
-  '03260_E_Inherited methods can only be overridden in Objective-C, add `'+
+  '03272_E_Inherited methods can only be overridden in Objective-C, add `'+
   '`override'#039#039'.'#000+
   '`override'#039#039'.'#000+
-  '03261_H_Inherited methods can only be overridden in Objective','-C, add'+
+  '03273_H_Inherited methods can only b','e overridden in Objective-C, add'+
   ' ``override'#039#039'.'#000+
   ' ``override'#039#039'.'#000+
-  '03262_E_Message name "$1" in inherited class is different from message'+
+  '03274_E_Message name "$1" in inherited class is different from message'+
   ' name "$2" in current class.'#000+
   ' name "$2" in current class.'#000+
-  '03263_E_It is not yet possible to make unique copies of Objective-C ty'+
+  '03275_E_It is not yet possible to make unique copies of Objective-C ty'+
   'pes'#000+
   'pes'#000+
-  '04000_E_Type mismatch'#000+
-  '04001_E_Incompatible ty','pes: got "$1" expected "$2"'#000+
+  '04000_E_Type mismatc','h'#000+
+  '04001_E_Incompatible types: got "$1" expected "$2"'#000+
   '04002_E_Type mismatch between "$1" and "$2"'#000+
   '04002_E_Type mismatch between "$1" and "$2"'#000+
   '04003_E_Type identifier expected'#000+
   '04003_E_Type identifier expected'#000+
   '04004_E_Variable identifier expected'#000+
   '04004_E_Variable identifier expected'#000+
   '04005_E_Integer expression expected, but got "$1"'#000+
   '04005_E_Integer expression expected, but got "$1"'#000+
-  '04006_E_Boolean expression expected, but got "$1','"'#000+
+  '04006_E_Boolean express','ion expected, but got "$1"'#000+
   '04007_E_Ordinal expression expected'#000+
   '04007_E_Ordinal expression expected'#000+
   '04008_E_pointer type expected, but got "$1"'#000+
   '04008_E_pointer type expected, but got "$1"'#000+
   '04009_E_class type expected, but got "$1"'#000+
   '04009_E_class type expected, but got "$1"'#000+
   '04011_E_Can'#039't evaluate constant expression'#000+
   '04011_E_Can'#039't evaluate constant expression'#000+
   '04012_E_Set elements are not compatible'#000+
   '04012_E_Set elements are not compatible'#000+
-  '04013_E_Operation not implemented',' for sets'#000+
+  '04013_E_','Operation not implemented for sets'#000+
   '04014_W_Automatic type conversion from floating type to COMP which is '+
   '04014_W_Automatic type conversion from floating type to COMP which is '+
   'an integer type'#000+
   'an integer type'#000+
   '04015_H_use DIV instead to get an integer result'#000+
   '04015_H_use DIV instead to get an integer result'#000+
-  '04016_E_string types doesn'#039't match, because of $V+ mode'#000+
-  '04017_E_succ or pred on enums with assi','gnments not possible'#000+
+  '04016_E_String types have to match exactly in $V+ mode'#000+
+  '04017_E_succ or',' pred on enums with assignments not possible'#000+
   '04018_E_Can'#039't read or write variables of this type'#000+
   '04018_E_Can'#039't read or write variables of this type'#000+
   '04019_E_Can'#039't use readln or writeln on typed file'#000+
   '04019_E_Can'#039't use readln or writeln on typed file'#000+
   '04020_E_Can'#039't use read or write on untyped file.'#000+
   '04020_E_Can'#039't use read or write on untyped file.'#000+
   '04021_E_Type conflict between set elements'#000+
   '04021_E_Type conflict between set elements'#000+
-  '04022_W_lo/hi(dword/qword)',' returns the upper/lower word/dword'#000+
+  '04','022_W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+
   '04023_E_Integer or real expression expected'#000+
   '04023_E_Integer or real expression expected'#000+
   '04024_E_Wrong type "$1" in array constructor'#000+
   '04024_E_Wrong type "$1" in array constructor'#000+
   '04025_E_Incompatible type for arg no. $1: Got "$2", expected "$3"'#000+
   '04025_E_Incompatible type for arg no. $1: Got "$2", expected "$3"'#000+
-  '04026_E_Method (variable) and Procedure (variable',') are not compatibl'+
+  '04026_E_Method (variable)',' and Procedure (variable) are not compatibl'+
   'e'#000+
   'e'#000+
   '04027_E_Illegal constant passed to internal math function'#000+
   '04027_E_Illegal constant passed to internal math function'#000+
   '04028_E_Can'#039't take the address of constant expressions'#000+
   '04028_E_Can'#039't take the address of constant expressions'#000+
   '04029_E_Argument can'#039't be assigned to'#000+
   '04029_E_Argument can'#039't be assigned to'#000+
-  '04030_E_Can'#039't assign local procedure/function to procedure variabl'+
-  'e'#000,
+  '04030_E_Can'#039't assign local procedure/functio','n to procedure varia'+
+  'ble'#000+
   '04031_E_Can'#039't assign values to an address'#000+
   '04031_E_Can'#039't assign values to an address'#000+
   '04032_E_Can'#039't assign values to const variable'#000+
   '04032_E_Can'#039't assign values to const variable'#000+
   '04033_E_Array type required'#000+
   '04033_E_Array type required'#000+
   '04034_E_interface type expected, but got "$1"'#000+
   '04034_E_interface type expected, but got "$1"'#000+
-  '04035_H_Mixing signed expressions and longwords gives a 64bit result'#000+
-  '04036_W_M','ixing signed expressions and cardinals here may cause a ran'+
-  'ge check error'#000+
+  '04035_H_Mixing signed expressions and longwords gives ','a 64bit result'+
+  #000+
+  '04036_W_Mixing signed expressions and cardinals here may cause a range'+
+  ' check error'#000+
   '04037_E_Typecast has different size ($1 -> $2) in assignment'#000+
   '04037_E_Typecast has different size ($1 -> $2) in assignment'#000+
   '04038_E_enums with assignments can'#039't be used as array index'#000+
   '04038_E_enums with assignments can'#039't be used as array index'#000+
-  '04039_E_Class or Object types "$1" and "$2" a','re not related'#000+
+  '04039_E_Class or Obje','ct types "$1" and "$2" are not related'#000+
   '04040_W_Class types "$1" and "$2" are not related'#000+
   '04040_W_Class types "$1" and "$2" are not related'#000+
   '04041_E_Class or interface type expected, but got "$1"'#000+
   '04041_E_Class or interface type expected, but got "$1"'#000+
   '04042_E_Type "$1" is not completely defined'#000+
   '04042_E_Type "$1" is not completely defined'#000+
-  '04043_W_String literal has more characters than short string length'#000+
-  '04044_W_','Comparison is always false due to range of values'#000+
+  '04043_W_String literal has more characters than shor','t string length'#000+
+  '04044_W_Comparison is always false due to range of values'#000+
   '04045_W_Comparison is always true due to range of values'#000+
   '04045_W_Comparison is always true due to range of values'#000+
   '04046_W_Constructing a class "$1" with abstract method "$2"'#000+
   '04046_W_Constructing a class "$1" with abstract method "$2"'#000+
-  '04047_H_The left operand of the IN operator should be byte sized'#000+
-  '04048_W_','Type size mismatch, possible loss of data / range check erro'+
-  'r'#000+
+  '04047_H_The left operand of the IN operator shoul','d be byte sized'#000+
+  '04048_W_Type size mismatch, possible loss of data / range check error'#000+
   '04049_H_Type size mismatch, possible loss of data / range check error'#000+
   '04049_H_Type size mismatch, possible loss of data / range check error'#000+
   '04050_E_The address of an abstract method can'#039't be taken'#000+
   '04050_E_The address of an abstract method can'#039't be taken'#000+
-  '04051_E_Assignments to formal parameters and open a','rrays are not pos'+
+  '04051_E_Assignments to form','al parameters and open arrays are not pos'+
   'sible'#000+
   'sible'#000+
   '04052_E_Constant Expression expected'#000+
   '04052_E_Constant Expression expected'#000+
   '04053_E_Operation "$1" not supported for types "$2" and "$3"'#000+
   '04053_E_Operation "$1" not supported for types "$2" and "$3"'#000+
   '04054_E_Illegal type conversion: "$1" to "$2"'#000+
   '04054_E_Illegal type conversion: "$1" to "$2"'#000+
-  '04055_H_Conversion between ordinals and pointers is not portable'#000+
-  '04056_W_','Conversion between ordinals and pointers is not portable'#000+
+  '04055_H_Conversion between ordinals and pointers ','is not portable'#000+
+  '04056_W_Conversion between ordinals and pointers is not portable'#000+
   '04057_E_Can'#039't determine which overloaded function to call'#000+
   '04057_E_Can'#039't determine which overloaded function to call'#000+
   '04058_E_Illegal counter variable'#000+
   '04058_E_Illegal counter variable'#000+
-  '04059_W_Converting constant real value to double for C variable argume'+
-  'nt, add explicit typec','ast to prevent this.'#000+
+  '04059_W_Converting constant real value to double for C variable argu','m'+
+  'ent, add explicit typecast to prevent this.'#000+
   '04060_E_Class or COM interface type expected, but got "$1"'#000+
   '04060_E_Class or COM interface type expected, but got "$1"'#000+
   '04061_E_Constant packed arrays are not yet supported'#000+
   '04061_E_Constant packed arrays are not yet supported'#000+
   '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+
   '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+
   'ed Array"'#000+
   'ed Array"'#000+
-  '04063_E_Incompatible type f','or arg no. $1: Got "$2" expected "(not pa'+
+  '040','63_E_Incompatible type for arg no. $1: Got "$2" expected "(not pa'+
   'cked) Array"'#000+
   'cked) Array"'#000+
   '04064_E_Elements of packed arrays cannot be of a type which need to be'+
   '04064_E_Elements of packed arrays cannot be of a type which need to be'+
   ' initialised'#000+
   ' initialised'#000+
   '04065_E_Constant packed records and objects are not yet supported'#000+
   '04065_E_Constant packed records and objects are not yet supported'#000+
-  '04066_W_Arithmetic "$1" on untyped po','inter is unportable to {$T+}, s'+
+  '04066_W_Arith','metic "$1" on untyped pointer is unportable to {$T+}, s'+
   'uggest typecast'#000+
   'uggest typecast'#000+
   '04076_E_Can'#039't take address of a subroutine marked as local'#000+
   '04076_E_Can'#039't take address of a subroutine marked as local'#000+
   '04077_E_Can'#039't export subroutine marked as local from a unit'#000+
   '04077_E_Can'#039't export subroutine marked as local from a unit'#000+
   '04078_E_Type is not automatable: "$1"'#000+
   '04078_E_Type is not automatable: "$1"'#000+
-  '04079_H_Converting the operands to "','$1" before doing the add could p'+
+  '04079_H_Conv','erting the operands to "$1" before doing the add could p'+
   'revent overflow errors.'#000+
   'revent overflow errors.'#000+
   '04080_H_Converting the operands to "$1" before doing the subtract coul'+
   '04080_H_Converting the operands to "$1" before doing the subtract coul'+
   'd prevent overflow errors.'#000+
   'd prevent overflow errors.'#000+
-  '04081_H_Converting the operands to "$1" before doing the multiply coul'+
-  'd prevent overflo','w errors.'#000+
+  '04081_H_Converting the operands to "$1" before doing the multip','ly co'+
+  'uld prevent overflow errors.'#000+
   '04082_W_Converting pointers to signed integers may result in wrong com'+
   '04082_W_Converting pointers to signed integers may result in wrong com'+
   'parison results and range errors, use an unsigned type instead.'#000+
   'parison results and range errors, use an unsigned type instead.'#000+
   '04083_E_Interface type $1 has no valid GUID'#000+
   '04083_E_Interface type $1 has no valid GUID'#000+
-  '04084_E_Invalid selector name "$1"'#000+
-  '04085_E_Expected ','Objective-C method, but got $1'#000+
+  '04084_E_Invalid selector nam','e "$1"'#000+
+  '04085_E_Expected Objective-C method, but got $1'#000+
   '04086_E_Expected Objective-C method or constant method name'#000+
   '04086_E_Expected Objective-C method or constant method name'#000+
   '04087_E_No type info available for this type'#000+
   '04087_E_No type info available for this type'#000+
   '04088_E_Ordinal or string expression expected'#000+
   '04088_E_Ordinal or string expression expected'#000+
-  '04089_E_String expression expected'#000+
-  '04090_E_Objective-C pro','tocol type expected, but got "$1"'#000+
-  '04091_E_The type "$1" is not supported for interaction with the Object'+
+  '04089_E_String expression expected',#000+
+  '04090_W_Converting 0 to NIL'#000+
+  '04091_E_Objective-C protocol type expected, but got "$1"'#000+
+  '04092_E_The type "$1" is not supported for interaction with the Object'+
   'ive-C runtime.'#000+
   'ive-C runtime.'#000+
-  '04092_E_Class or objcclass type expected, but got "$1"'#000+
-  '05000_E_Identifier not found "$1"'#000+
-  '05001_F_Internal Error in SymTab','leStack()'#000+
+  '04093_E_Class or objcclass type expected, but got "$1"'#000+
+  '05000_E_Identi','fier not found "$1"'#000+
+  '05001_F_Internal Error in SymTableStack()'#000+
   '05002_E_Duplicate identifier "$1"'#000+
   '05002_E_Duplicate identifier "$1"'#000+
   '05003_H_Identifier already defined in $1 at line $2'#000+
   '05003_H_Identifier already defined in $1 at line $2'#000+
   '05004_E_Unknown identifier "$1"'#000+
   '05004_E_Unknown identifier "$1"'#000+
   '05005_E_Forward declaration not solved "$1"'#000+
   '05005_E_Forward declaration not solved "$1"'#000+
-  '05007_E_Error in type definition'#000+
-  '05009_E_Forward type not resolved "','$1"'#000+
+  '05007_E_Error in',' type definition'#000+
+  '05009_E_Forward type not resolved "$1"'#000+
   '05010_E_Only static variables can be used in static methods or outside'+
   '05010_E_Only static variables can be used in static methods or outside'+
   ' methods'#000+
   ' methods'#000+
   '05012_F_record or class type expected'#000+
   '05012_F_record or class type expected'#000+
-  '05013_E_Instances of classes or objects with an abstract method are no'+
-  't allowed'#000+
+  '05013_E_Instances of classes or objects with an abstract method are',' '+
+  'not allowed'#000+
   '05014_W_Label not defined "$1"'#000+
   '05014_W_Label not defined "$1"'#000+
-  '05015_E_','Label used but not defined "$1"'#000+
+  '05015_E_Label used but not defined "$1"'#000+
   '05016_E_Illegal label declaration'#000+
   '05016_E_Illegal label declaration'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   '05018_E_Label not found'#000+
   '05018_E_Label not found'#000+
   '05019_E_identifier isn'#039't a label'#000+
   '05019_E_identifier isn'#039't a label'#000+
-  '05020_E_label already defined'#000+
-  '05021_E_illegal type declarat','ion of set elements'#000+
+  '05020_E','_label already defined'#000+
+  '05021_E_illegal type declaration of set elements'#000+
   '05022_E_Forward class definition not resolved "$1"'#000+
   '05022_E_Forward class definition not resolved "$1"'#000+
   '05023_H_Unit "$1" not used in $2'#000+
   '05023_H_Unit "$1" not used in $2'#000+
   '05024_H_Parameter "$1" not used'#000+
   '05024_H_Parameter "$1" not used'#000+
   '05025_N_Local variable "$1" not used'#000+
   '05025_N_Local variable "$1" not used'#000+
-  '05026_H_Value parameter "$1" is assigned but never used'#000+
-  '05027_N_Loc','al variable "$1" is assigned but never used'#000+
+  '05026_H_Value p','arameter "$1" is assigned but never used'#000+
+  '05027_N_Local variable "$1" is assigned but never used'#000+
   '05028_H_Local $1 "$2" is not used'#000+
   '05028_H_Local $1 "$2" is not used'#000+
   '05029_N_Private field "$1.$2" is never used'#000+
   '05029_N_Private field "$1.$2" is never used'#000+
   '05030_N_Private field "$1.$2" is assigned but never used'#000+
   '05030_N_Private field "$1.$2" is assigned but never used'#000+
-  '05031_N_Private method "$1.$2" never used'#000+
-  '05032_E_Set type ex','pected'#000+
+  '05031_N_P','rivate method "$1.$2" never used'#000+
+  '05032_E_Set type expected'#000+
   '05033_W_Function result does not seem to be set'#000+
   '05033_W_Function result does not seem to be set'#000+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#000+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#000+
   '05035_E_Unknown record field identifier "$1"'#000+
   '05035_E_Unknown record field identifier "$1"'#000+
-  '05036_W_Local variable "$1" does not seem to be initialized'#000+
-  '05037_W_Varia','ble "$1" does not seem to be initialized'#000+
+  '05036_W_Local variabl','e "$1" does not seem to be initialized'#000+
+  '05037_W_Variable "$1" does not seem to be initialized'#000+
   '05038_E_identifier idents no member "$1"'#000+
   '05038_E_identifier idents no member "$1"'#000+
   '05039_H_Found declaration: $1'#000+
   '05039_H_Found declaration: $1'#000+
   '05040_E_Data element too large'#000+
   '05040_E_Data element too large'#000+
-  '05042_E_No matching implementation for interface method "$1" found'#000+
-  '05043_W_Symbol "$1" is depreca','ted'#000+
+  '05042_E_No matching implementation for interf','ace method "$1" found'#000+
+  '05043_W_Symbol "$1" is deprecated'#000+
   '05044_W_Symbol "$1" is not portable'#000+
   '05044_W_Symbol "$1" is not portable'#000+
   '05055_W_Symbol "$1" is not implemented'#000+
   '05055_W_Symbol "$1" is not implemented'#000+
   '05056_E_Can'#039't create unique type from this type'#000+
   '05056_E_Can'#039't create unique type from this type'#000+
   '05057_H_Local variable "$1" does not seem to be initialized'#000+
   '05057_H_Local variable "$1" does not seem to be initialized'#000+
-  '05058_H_Variable "$1" does not seem to be initialized',#000+
+  '0','5058_H_Variable "$1" does not seem to be initialized'#000+
   '05059_W_Function result variable does not seem to initialized'#000+
   '05059_W_Function result variable does not seem to initialized'#000+
   '05060_H_Function result variable does not seem to be initialized'#000+
   '05060_H_Function result variable does not seem to be initialized'#000+
   '05061_W_Variable "$1" read but nowhere assigned'#000+
   '05061_W_Variable "$1" read but nowhere assigned'#000+
-  '05062_H_Found abstract method: $1'#000+
-  '05063_W_Symbol "$1" is experim','ental'#000+
+  '05062_H_Foun','d abstract method: $1'#000+
+  '05063_W_Symbol "$1" is experimental'#000+
   '05064_W_Forward declaration "$1" not resolved, assumed external'#000+
   '05064_W_Forward declaration "$1" not resolved, assumed external'#000+
-  '05065_E_Mismatch between number of declared parameters and number of c'+
+  '05065_W_Symbol "$1" is belongs to a library'#000+
+  '05066_W_Symbol "$1" is deprecated: "$2"'#000+
+  '05067_E_Can not find an enumerator',' for the type "$1"'#000+
+  '05068_E_Can not find a "MoveNext" method in enumerator "$1"'#000+
+  '05069_E_Can not find a "Current" property in enumerator "$1"'#000+
+  '05070_E_Mismatch between number of declared parameters and number of c'+
   'olons in message string.'#000+
   'olons in message string.'#000+
-  '06009_E_Parameter list size exceeds 65535 bytes'#000+
-  '06012_E_File types must be ','var parameters'#000+
+  '06009','_E_Parameter list size exceeds 65535 bytes'#000+
+  '06012_E_File types must be var parameters'#000+
   '06013_E_The use of a far pointer isn'#039't allowed there'#000+
   '06013_E_The use of a far pointer isn'#039't allowed there'#000+
   '06015_E_EXPORT declared functions can'#039't be called'#000+
   '06015_E_EXPORT declared functions can'#039't be called'#000+
-  '06016_W_Possible illegal call of constructor or destructor'#000+
+  '06016_W_Possible illegal call of constructor or dest','ructor'#000+
   '06017_N_Inefficient code'#000+
   '06017_N_Inefficient code'#000+
   '06018_W_unreachable code'#000+
   '06018_W_unreachable code'#000+
-  '06020_E_Abstr','act methods can'#039't be called directly'#000+
+  '06020_E_Abstract methods can'#039't be called directly'#000+
   '06027_DL_Register $1 weight $2 $3'#000+
   '06027_DL_Register $1 weight $2 $3'#000+
   '06029_DL_Stack frame is omitted'#000+
   '06029_DL_Stack frame is omitted'#000+
   '06031_E_Object or class methods can'#039't be inline.'#000+
   '06031_E_Object or class methods can'#039't be inline.'#000+
-  '06032_E_Procvar calls cannot be inline.'#000+
+  '06032_E_Procvar ca','lls cannot be inline.'#000+
   '06033_E_No code for inline procedure stored'#000+
   '06033_E_No code for inline procedure stored'#000+
-  '0603','5_E_Element zero of an ansi/wide- or longstring can'#039't be acc'+
-  'essed, use (set)length instead'#000+
+  '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+
+  'sed, use (set)length instead'#000+
   '06037_E_Constructors or destructors can not be called inside a '#039'wi'+
   '06037_E_Constructors or destructors can not be called inside a '#039'wi'+
   'th'#039' clause'#000+
   'th'#039' clause'#000+
-  '06038_E_Cannot call message handler methods directly'#000+
-  '06039_E_Jump in or ','outside of an exception block'#000+
+  '06','038_E_Cannot call message handler methods directly'#000+
+  '06039_E_Jump in or outside of an exception block'#000+
   '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+
   '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+
   '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+
   '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+
-  '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+
-  '06043_E_Local variables size ','exceeds supported limit'#000+
+  '06042_W_Local vari','able size exceed limit for certain cpu'#039's'#000+
+  '06043_E_Local variables size exceeds supported limit'#000+
   '06044_E_BREAK not allowed'#000+
   '06044_E_BREAK not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
   '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
   '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
   'me library.'#000+
   'me library.'#000+
-  '06047_F_Cannot find system type "$1". Check if you use the correct run'+
-  ' time lib','rary.'#000+
+  '06047_F_C','annot find system type "$1". Check if you use the correct r'+
+  'un time library.'#000+
   '06048_H_Inherited call to abstract method ignored'#000+
   '06048_H_Inherited call to abstract method ignored'#000+
   '06049_E_Goto label "$1" not defined or optimized away'#000+
   '06049_E_Goto label "$1" not defined or optimized away'#000+
-  '06050_F_Cannot find type "$1" in unit "$2". Check if you use the corre'+
-  'ct run time library.'#000+
-  '07000_DL_Starting $1 styled assembler p','arsing'#000+
+  '06050_F_Cannot find type "$1" in unit "$2". Check if you use',' the cor'+
+  'rect run time library.'#000+
+  '07000_DL_Starting $1 styled assembler parsing'#000+
   '07001_DL_Finished $1 styled assembler parsing'#000+
   '07001_DL_Finished $1 styled assembler parsing'#000+
   '07002_E_Non-label pattern contains @'#000+
   '07002_E_Non-label pattern contains @'#000+
   '07004_E_Error building record offset'#000+
   '07004_E_Error building record offset'#000+
   '07005_E_OFFSET used without identifier'#000+
   '07005_E_OFFSET used without identifier'#000+
-  '07006_E_TYPE used without identifier'#000+
-  '07007_E_Cannot use local variable or ','parameters here'#000+
+  '0700','6_E_TYPE used without identifier'#000+
+  '07007_E_Cannot use local variable or parameters here'#000+
   '07008_E_need to use OFFSET here'#000+
   '07008_E_need to use OFFSET here'#000+
   '07009_E_need to use $ here'#000+
   '07009_E_need to use $ here'#000+
   '07010_E_Cannot use multiple relocatable symbols'#000+
   '07010_E_Cannot use multiple relocatable symbols'#000+
   '07011_E_Relocatable symbol can only be added'#000+
   '07011_E_Relocatable symbol can only be added'#000+
-  '07012_E_Invalid constant expression'#000+
-  '07013_E_Relocatable symbol is not al','lowed'#000+
+  '07','012_E_Invalid constant expression'#000+
+  '07013_E_Relocatable symbol is not allowed'#000+
   '07014_E_Invalid reference syntax'#000+
   '07014_E_Invalid reference syntax'#000+
   '07015_E_You can not reach $1 from that code'#000+
   '07015_E_You can not reach $1 from that code'#000+
   '07016_E_Local symbols/labels aren'#039't allowed as references'#000+
   '07016_E_Local symbols/labels aren'#039't allowed as references'#000+
-  '07017_E_Invalid base and index register usage'#000+
+  '07017_E_Invalid base and inde','x register usage'#000+
   '07018_W_Possible error in object field handling'#000+
   '07018_W_Possible error in object field handling'#000+
-  '07019','_E_Wrong scale factor specified'#000+
+  '07019_E_Wrong scale factor specified'#000+
   '07020_E_Multiple index register usage'#000+
   '07020_E_Multiple index register usage'#000+
   '07021_E_Invalid operand type'#000+
   '07021_E_Invalid operand type'#000+
   '07022_E_Invalid string as opcode operand: $1'#000+
   '07022_E_Invalid string as opcode operand: $1'#000+
-  '07023_W_@CODE and @DATA not supported'#000+
+  '07023_W_@CODE and @DATA no','t supported'#000+
   '07024_E_Null label references are not allowed'#000+
   '07024_E_Null label references are not allowed'#000+
-  '07025_E_Divi','de by zero in asm evaluator'#000+
+  '07025_E_Divide by zero in asm evaluator'#000+
   '07026_E_Illegal expression'#000+
   '07026_E_Illegal expression'#000+
   '07027_E_escape sequence ignored: $1'#000+
   '07027_E_escape sequence ignored: $1'#000+
   '07028_E_Invalid symbol reference'#000+
   '07028_E_Invalid symbol reference'#000+
-  '07029_W_Fwait can cause emulation problems with emu387'#000+
+  '07029_W_Fwait can cause emulation problems wit','h emu387'#000+
   '07030_W_$1 without operand translated into $1P'#000+
   '07030_W_$1 without operand translated into $1P'#000+
-  '07031_W_ENTER ','instruction is not supported by Linux kernel'#000+
+  '07031_W_ENTER instruction is not supported by Linux kernel'#000+
   '07032_W_Calling an overload function in assembler'#000+
   '07032_W_Calling an overload function in assembler'#000+
   '07033_E_Unsupported symbol type for operand'#000+
   '07033_E_Unsupported symbol type for operand'#000+
-  '07034_E_Constant value out of bounds'#000+
+  '07034_E_Constant value out of b','ounds'#000+
   '07035_E_Error converting decimal $1'#000+
   '07035_E_Error converting decimal $1'#000+
-  '07036_E_Error converting oct','al $1'#000+
+  '07036_E_Error converting octal $1'#000+
   '07037_E_Error converting binary $1'#000+
   '07037_E_Error converting binary $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07039_H_$1 translated to $2'#000+
   '07039_H_$1 translated to $2'#000+
   '07040_W_$1 is associated to an overloaded function'#000+
   '07040_W_$1 is associated to an overloaded function'#000+
-  '07041_E_Cannot use SELF outside a method'#000+
-  '07042_E_Cannot use OLDEBP outside a nes','ted procedure'#000+
+  '07041_E_Ca','nnot use SELF outside a method'#000+
+  '07042_E_Cannot use OLDEBP outside a nested procedure'#000+
   '07043_W_Procedures can'#039't return any value in asm code'#000+
   '07043_W_Procedures can'#039't return any value in asm code'#000+
   '07044_E_SEG not supported'#000+
   '07044_E_SEG not supported'#000+
   '07045_E_Size suffix and destination or source size do not match'#000+
   '07045_E_Size suffix and destination or source size do not match'#000+
-  '07046_W_Size suffix and destination or source size do not match'#000+
-  '07047_E_Assembler ','syntax error'#000+
+  '07046_W_Size',' suffix and destination or source size do not match'#000+
+  '07047_E_Assembler syntax error'#000+
   '07048_E_Invalid combination of opcode and operands'#000+
   '07048_E_Invalid combination of opcode and operands'#000+
   '07049_E_Assembler syntax error in operand'#000+
   '07049_E_Assembler syntax error in operand'#000+
   '07050_E_Assembler syntax error in constant'#000+
   '07050_E_Assembler syntax error in constant'#000+
-  '07051_E_Invalid String expression'#000+
-  '07052_W_constant with symbol $1 for address which is not ','on a pointe'+
-  'r'#000+
+  '07051_E_Invalid Strin','g expression'#000+
+  '07052_W_constant with symbol $1 for address which is not on a pointer'#000+
   '07053_E_Unrecognized opcode $1'#000+
   '07053_E_Unrecognized opcode $1'#000+
   '07054_E_Invalid or missing opcode'#000+
   '07054_E_Invalid or missing opcode'#000+
   '07055_E_Invalid combination of prefix and opcode: $1'#000+
   '07055_E_Invalid combination of prefix and opcode: $1'#000+
-  '07056_E_Invalid combination of override and opcode: $1'#000+
+  '07056_E_Invalid combination of override',' and opcode: $1'#000+
   '07057_E_Too many operands on line'#000+
   '07057_E_Too many operands on line'#000+
-  '07058_W_NEAR ignored',#000+
+  '07058_W_NEAR ignored'#000+
   '07059_W_FAR ignored'#000+
   '07059_W_FAR ignored'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07062_E_Unknown label identifier $1'#000+
   '07062_E_Unknown label identifier $1'#000+
   '07063_E_Invalid register name'#000+
   '07063_E_Invalid register name'#000+
-  '07064_E_Invalid floating point register name'#000+
+  '07064_E_Invalid',' floating point register name'#000+
   '07066_W_Modulo not supported'#000+
   '07066_W_Modulo not supported'#000+
-  '07067_E_Inv','alid floating point constant $1'#000+
+  '07067_E_Invalid floating point constant $1'#000+
   '07068_E_Invalid floating point expression'#000+
   '07068_E_Invalid floating point expression'#000+
   '07069_E_Wrong symbol type'#000+
   '07069_E_Wrong symbol type'#000+
   '07070_E_Cannot index a local var or parameter with a register'#000+
   '07070_E_Cannot index a local var or parameter with a register'#000+
-  '07071_E_Invalid segment override expression'#000+
-  '07072_W_Identifier $1 supposed ext','ernal'#000+
+  '07071_E_','Invalid segment override expression'#000+
+  '07072_W_Identifier $1 supposed external'#000+
   '07073_E_Strings not allowed as constants'#000+
   '07073_E_Strings not allowed as constants'#000+
   '07074_No type of variable specified'#000+
   '07074_No type of variable specified'#000+
   '07075_E_assembler code not returned to text section'#000+
   '07075_E_assembler code not returned to text section'#000+
-  '07076_E_Not a directive or local symbol $1'#000+
+  '07076_E_Not a directive or local sy','mbol $1'#000+
   '07077_E_Using a defined name as a local label'#000+
   '07077_E_Using a defined name as a local label'#000+
-  '07078_E_Dollar t','oken is used without an identifier'#000+
+  '07078_E_Dollar token is used without an identifier'#000+
   '07079_W_32bit constant created for address'#000+
   '07079_W_32bit constant created for address'#000+
   '07080_N_.align is target specific, use .balign or .p2align'#000+
   '07080_N_.align is target specific, use .balign or .p2align'#000+
-  '07081_E_Can'#039't access fields directly for parameters'#000+
-  '07082_E_Can'#039't access fields of objects/classes dire','ctly'#000+
+  '07081_E_Can'#039't access fields direc','tly for parameters'#000+
+  '07082_E_Can'#039't access fields of objects/classes directly'#000+
   '07083_E_No size specified and unable to determine the size of the oper'+
   '07083_E_No size specified and unable to determine the size of the oper'+
   'ands'#000+
   'ands'#000+
   '07084_E_Cannot use RESULT in this function'#000+
   '07084_E_Cannot use RESULT in this function'#000+
-  '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+
+  '07086_W_"$1" without operand translated into "$','1 %st,%st(1)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
-  '0708','8_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
+  '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
   '07089_E_Char < not allowed here'#000+
   '07089_E_Char < not allowed here'#000+
   '07090_E_Char > not allowed here'#000+
   '07090_E_Char > not allowed here'#000+
   '07093_W_ALIGN not supported'#000+
   '07093_W_ALIGN not supported'#000+
-  '07094_E_Inc and Dec cannot be together'#000+
+  '07094_E_Inc and Dec cannot be ','together'#000+
   '07095_E_Invalid reglist for movem'#000+
   '07095_E_Invalid reglist for movem'#000+
-  '07096_E_Reglist invalid for',' opcode'#000+
+  '07096_E_Reglist invalid for opcode'#000+
   '07097_E_Higher cpu mode required ($1)'#000+
   '07097_E_Higher cpu mode required ($1)'#000+
   '07098_W_No size specified and unable to determine the size of the oper'+
   '07098_W_No size specified and unable to determine the size of the oper'+
   'ands, using DWORD as default'#000+
   'ands, using DWORD as default'#000+
-  '07099_E_Syntax error while trying to parse a shifter operand'#000+
-  '07100_E_Address of packed componen','t is not at a byte boundary'#000+
+  '07099_E_Syntax error whil','e trying to parse a shifter operand'#000+
+  '07100_E_Address of packed component is not at a byte boundary'#000+
   '07101_W_No size specified and unable to determine the size of the oper'+
   '07101_W_No size specified and unable to determine the size of the oper'+
   'ands, using BYTE as default'#000+
   'ands, using BYTE as default'#000+
-  '07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
-  '07103_W_Use of +offset(%ebp) is not compatible with regca','ll conventi'+
-  'on'#000+
+  '07102_W_Use of +offset(%ebp) for parameters ','invalid here'#000+
+  '07103_W_Use of +offset(%ebp) is not compatible with regcall convention'+
+  #000+
   '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
   '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
   'ess'#000+
   'ess'#000+
   '07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
   '07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
   ' lost'#000+
   ' lost'#000+
-  '07106_E_VMTOffset must be used in combination with a virtual method, a'+
-  'nd "$1','" is not virtual'#000+
+  '07106_','E_VMTOffset must be used in combination with a virtual method,'+
+  ' and "$1" is not virtual'#000+
   '07107_E_Generating PIC, but reference is not PIC-safe'#000+
   '07107_E_Generating PIC, but reference is not PIC-safe'#000+
   '08000_F_Too many assembler files'#000+
   '08000_F_Too many assembler files'#000+
   '08001_F_Selected assembler output not supported'#000+
   '08001_F_Selected assembler output not supported'#000+
-  '08002_F_Comp not supported'#000+
+  '08002_F_Comp not s','upported'#000+
   '08003_F_Direct not support for binary writers'#000+
   '08003_F_Direct not support for binary writers'#000+
-  '08004_E_Allocat','ing of data is only allowed in bss section'#000+
+  '08004_E_Allocating of data is only allowed in bss section'#000+
   '08005_F_No binary writer selected'#000+
   '08005_F_No binary writer selected'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
-  '08007_E_Asm: $1 invalid combination of opcode and operands'#000+
+  '08007_E_Asm: $1 invalid combination of opcode and operand','s'#000+
   '08008_E_Asm: 16 Bit references not supported'#000+
   '08008_E_Asm: 16 Bit references not supported'#000+
-  '08009_E_Asm: Invalid ef','fective address'#000+
+  '08009_E_Asm: Invalid effective address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
   '08012_E_Asm: Short jump is out of range $1'#000+
   '08012_E_Asm: Short jump is out of range $1'#000+
-  '08013_E_Asm: Undefined label $1'#000+
+  '08013_E_Asm: Undefined lab','el $1'#000+
   '08014_E_Asm: Comp type not supported for this target'#000+
   '08014_E_Asm: Comp type not supported for this target'#000+
-  '08015_E_Asm',': Extended type not supported for this target'#000+
+  '08015_E_Asm: Extended type not supported for this target'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08018_E_Asm: First defined here'#000+
   '08018_E_Asm: First defined here'#000+
-  '08019_E_Asm: Invalid register $1'#000+
+  '08019_E_Asm: Invalid registe','r $1'#000+
   '08020_E_Asm: 16 or 32 Bit references not supported'#000+
   '08020_E_Asm: 16 or 32 Bit references not supported'#000+
-  '08021_E_Asm: 6','4 Bit operands not supported'#000+
+  '08021_E_Asm: 64 Bit operands not supported'#000+
   '09000_W_Source operating system redefined'#000+
   '09000_W_Source operating system redefined'#000+
   '09001_I_Assembling (pipe) $1'#000+
   '09001_I_Assembling (pipe) $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
-  '09003_E_Can'#039't create object file: $1'#000+
+  '09003_E_Can'#039't create object fi','le: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
-  '09005_E_Assembler $1 not ','found, switching to external assembling'#000+
+  '09005_E_Assembler $1 not found, switching to external assembling'#000+
   '09006_T_Using assembler: $1'#000+
   '09006_T_Using assembler: $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
-  '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
-  'ssembling'#000+
+  '09008_E_Can'#039't call the assembler, error $1 switching to ext','ernal'+
+  ' assembling'#000+
   '09009_I_Assembling $1'#000+
   '09009_I_Assembling $1'#000+
-  '09010_I_Assembling with smartli','nking $1'#000+
+  '09010_I_Assembling with smartlinking $1'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09012_W_Library $1 not found, Linking may fail !'#000+
   '09012_W_Library $1 not found, Linking may fail !'#000+
   '09013_E_Error while linking'#000+
   '09013_E_Error while linking'#000+
-  '09014_E_Can'#039't call the linker, switching to external linking'#000+
+  '09014_E_Can'#039't call the linker, switc','hing to external linking'#000+
   '09015_I_Linking $1'#000+
   '09015_I_Linking $1'#000+
-  '09016_E_Util $1 not found,',' switching to external linking'#000+
+  '09016_E_Util $1 not found, switching to external linking'#000+
   '09017_T_Using util $1'#000+
   '09017_T_Using util $1'#000+
   '09018_E_Creation of Executables not supported'#000+
   '09018_E_Creation of Executables not supported'#000+
   '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
-  '09020_I_Closing script $1'#000+
-  '09021_E_resource compiler "$1" not found, switching to e','xternal mode'+
-  #000+
+  '09020_I_Clos','ing script $1'#000+
+  '09021_E_resource compiler "$1" not found, switching to external mode'#000+
   '09022_I_Compiling resource $1'#000+
   '09022_I_Compiling resource $1'#000+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   'king'#000+
   'king'#000+
-  '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+
-  #000+
-  '09025_T_unit $1 can'#039't be shared linked, switching to static',' link'+
-  'ing'#000+
+  '09024_T_unit $1 can'#039't be smart linked, switching to stat','ic linki'+
+  'ng'#000+
+  '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
+  'g'#000+
   '09026_E_unit $1 can'#039't be smart or static linked'#000+
   '09026_E_unit $1 can'#039't be smart or static linked'#000+
   '09027_E_unit $1 can'#039't be shared or static linked'#000+
   '09027_E_unit $1 can'#039't be shared or static linked'#000+
-  '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
+  '09028_D_Calling resource compiler "$1" with "$2" as command line',#000+
   '09029_E_Error while compiling resources'#000+
   '09029_E_Error while compiling resources'#000+
-  '09030_E_Can'#039't call the resour','ce compiler "$1", switching to exte'+
-  'rnal mode'#000+
+  '09030_E_Can'#039't call the resource compiler "$1", switching to extern'+
+  'al mode'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
   '09032_E_Can'#039't write resource file "$1"'#000+
   '09032_E_Can'#039't write resource file "$1"'#000+
   '09128_F_Can'#039't post process executable $1'#000+
   '09128_F_Can'#039't post process executable $1'#000+
-  '09129_F_Can'#039't open executable $1'#000+
+  '09129_F','_Can'#039't open executable $1'#000+
   '09130_X_Size of Code: $1 bytes'#000+
   '09130_X_Size of Code: $1 bytes'#000+
-  '09131_X_Size ','of initialized data: $1 bytes'#000+
+  '09131_X_Size of initialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09134_X_Stack space committed: $1 bytes'#000+
   '09134_X_Stack space committed: $1 bytes'#000+
-  '09200_F_Executable image size is too big for $1 target.'#000+
-  '09201_W_Object file "$1" conta','ins 32-bit absolute relocation to symb'+
-  'ol "$2".'#000+
+  '09200_F_Executab','le image size is too big for $1 target.'#000+
+  '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
+  ' "$2".'#000+
   '10000_T_Unitsearch: $1'#000+
   '10000_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10003_U_PPU Flags: $1'#000+
   '10003_U_PPU Flags: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10004_U_PPU Crc: $1'#000+
-  '10005_U_PPU Time: $1'#000+
+  '10005_U_PPU Ti','me: $1'#000+
   '10006_U_PPU File too short'#000+
   '10006_U_PPU File too short'#000+
-  '10007_U_PPU Invalid Header (no PPU a','t the begin)'#000+
+  '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10009_U_PPU is compiled for another processor'#000+
   '10009_U_PPU is compiled for another processor'#000+
   '10010_U_PPU is compiled for an other target'#000+
   '10010_U_PPU is compiled for an other target'#000+
   '10011_U_PPU Source: $1'#000+
   '10011_U_PPU Source: $1'#000+
-  '10012_U_Writing $1'#000+
+  '10012_U_Writi','ng $1'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
-  '1001','5_F_unexpected end of PPU-File'#000+
+  '10015_F_unexpected end of PPU-File'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10018_E_Illegal unit name: $1'#000+
   '10018_E_Illegal unit name: $1'#000+
   '10019_F_Too much units'#000+
   '10019_F_Too much units'#000+
-  '10020_F_Circular unit reference between $1 and $2'#000+
-  '10021_F_Can'#039't compile unit $1, no sources',' available'#000+
+  '10020_F_Circular unit',' reference between $1 and $2'#000+
+  '10021_F_Can'#039't compile unit $1, no sources available'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10024_F_Unit $1 searched but $2 found'#000+
   '10024_F_Unit $1 searched but $2 found'#000+
-  '10025_W_Compiling the system unit requires the -Us switch'#000+
-  '10026_F_There were $1 errors compiling module, stop','ping'#000+
+  '10025_W_Compiling the system unit requi','res the -Us switch'#000+
+  '10026_F_There were $1 errors compiling module, stopping'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10029_U_Recompiling $1, source found only'#000+
   '10029_U_Recompiling $1, source found only'#000+
-  '10030_U_Recompiling unit, static lib is older than ppufile'#000+
-  '10031_U_Recompiling unit, shared lib is older than p','pufile'#000+
+  '10030_U_Recompiling unit, static lib is o','lder than ppufile'#000+
+  '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
   '10034_U_Parsing interface of $1'#000+
   '10034_U_Parsing interface of $1'#000+
-  '10035_U_Parsing implementation of $1'#000+
+  '10035_U_Parsing implem','entation of $1'#000+
   '10036_U_Second load for unit $1'#000+
   '10036_U_Second load for unit $1'#000+
-  '10037_U_PPU Check file ','$1 time $2'#000+
+  '10037_U_PPU Check file $1 time $2'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10041_U_File $1 is newer than PPU file $2'#000+
   '10041_U_File $1 is newer than PPU file $2'#000+
-  '10042_U_Trying to use a unit which was compiled with a different FPU m'+
-  'ode'#000+
+  '10042_U_Trying to use a unit which was compiled with',' a different FPU'+
+  ' mode'#000+
   '10043_U_Loading interface units from $1'#000+
   '10043_U_Loading interface units from $1'#000+
-  '10044_U_','Loading implementation units from $1'#000+
+  '10044_U_Loading implementation units from $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10046_U_Implementation CRC changed for unit $1'#000+
   '10046_U_Implementation CRC changed for unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
-  '10048_U_Add dependency of $1 to $2'#000+
+  '10048_U_A','dd dependency of $1 to $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10049_U_No reload, is caller: $1'#000+
-  '10050_U_No ','reload, already in second compile: $1'#000+
+  '10050_U_No reload, already in second compile: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10052_U_Forced reloading'#000+
   '10052_U_Forced reloading'#000+
   '10053_U_Previous state of $1: $2'#000+
   '10053_U_Previous state of $1: $2'#000+
-  '10054_U_Already compiling $1, setting second compile'#000+
+  '10054_U_Already compiling $1, setting second c','ompile'#000+
   '10055_U_Loading unit $1'#000+
   '10055_U_Loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
-  '10057_','U_Registering new unit $1'#000+
+  '10057_U_Registering new unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
-  '10061_E_Unit $1 was compiled using a different whole program optimizat'+
-  'ion',' feedback input ($2, $3); recompile it without wpo or use the sam'+
+  '100','61_E_Unit $1 was compiled using a different whole program optimiz'+
+  'ation feedback input ($2, $3); recompile it without wpo or use the sam'+
   'e wpo feedback input file for this compilation invocation'#000+
   'e wpo feedback input file for this compilation invocation'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
-  '11001_W_Only one source file supported, changing source file to compil'+
-  'e fr','om "$1" into "$2"'#000+
+  '1100','1_W_Only one source file supported, changing source file to comp'+
+  'ile from "$1" into "$2"'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11003_E_nested response files are not supported'#000+
   '11003_E_nested response files are not supported'#000+
   '11004_F_No source file name in command line'#000+
   '11004_F_No source file name in command line'#000+
-  '11005_N_No option inside $1 config file'#000+
+  '11005_N_No opt','ion inside $1 config file'#000+
   '11006_E_Illegal parameter: $1'#000+
   '11006_E_Illegal parameter: $1'#000+
-  '11007_H_-? wri','tes help pages'#000+
+  '11007_H_-? writes help pages'#000+
   '11008_F_Too many config files nested'#000+
   '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
   '11009_F_Unable to open file $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11011_W_Target is already set to: $1'#000+
-  '11012_W_Shared libs not supported on DOS platform, reverting to static'+
-  #000+
-  '11013_F_I','n options file $1 at line $2 too many \var{\#IF(N)DEFs} enc'+
-  'ountered'#000+
+  '11012_W_Sh','ared libs not supported on DOS platform, reverting to stat'+
+  'ic'#000+
+  '11013_F_In options file $1 at line $2 too many \var{\#IF(N)DEFs} encou'+
+  'ntered'#000+
   '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
   '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
   'tered'#000+
   'tered'#000+
-  '11015_F_Open conditional at the end of the options file'#000+
-  '11016_W_Debug information generation is ','not supported by this execut'+
-  'able'#000+
+  '11015_F_Open conditional a','t the end of the options file'#000+
+  '11016_W_Debug information generation is not supported by this executab'+
+  'le'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11018_W_You are using the obsolete switch $1'#000+
   '11018_W_You are using the obsolete switch $1'#000+
-  '11019_W_You are using the obsolete switch $1, please use $2'#000+
+  '11019_W_You are using the obsolete switch $1, please use ','$2'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
-  '110','21_W_Assembler output selected "$1" is not compatible with "$2"'#000+
+  '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11026_T_Reading options from file $1'#000+
   '11026_T_Reading options from file $1'#000+
-  '11027_T_Reading options from environment $1'#000+
+  '11027_T_Reading options from enviro','nment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11028_D_Handling option "$1"'#000+
   '11029_O_*** press enter ***'#000+
   '11029_O_*** press enter ***'#000+
-  '1103','0_H_Start of reading config file $1'#000+
+  '11030_H_Start of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
   '11032_D_interpreting option "$1"'#000+
   '11032_D_interpreting option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
-  '11033_D_interpreting file option "$1"'#000+
+  '11033_D_interpreting',' file option "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
-  '11035_D_found sourc','e file name "$1"'#000+
+  '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11039_E_Unknown code page'#000+
   '11040_F_Config file $1 is a directory'#000+
   '11040_F_Config file $1 is a directory'#000+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   'ugging disabled'#000+
   'ugging disabled'#000+
-  '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
-  '11043','_F_In options file $1 at line $2 \var{\#ELSE} directive without'+
-  ' \var{\#IF(N)DEF} found'#000+
+  '110','42_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
+  '11043_F_In options file $1 at line $2 \var{\#ELSE} directive without \'+
+  'var{\#IF(N)DEF} found'#000+
   '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
   '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
   't platform'#000+
   't platform'#000+
-  '11045_F_The feature "$1" is not, or not yet, supported on the selected'+
-  ' t','arget platform'#000+
+  '11','045_F_The feature "$1" is not, or not yet, supported on the select'+
+  'ed target platform'#000+
   '11046_N_DWARF debug information cannot be used with smart linking on t'+
   '11046_N_DWARF debug information cannot be used with smart linking on t'+
   'his target, switching to static linking'#000+
   'his target, switching to static linking'#000+
-  '11047_W_Option "$1" is ignored for the current target platform.'#000+
-  '12000_F_Cannot open whole program optimization feed','back file "$1"'#000+
+  '11047_W_Option "$1" is ignored for the curren','t target platform.'#000+
+  '12000_F_Cannot open whole program optimization feedback file "$1"'#000+
   '12001_D_Processing whole program optimization information in wpo feedb'+
   '12001_D_Processing whole program optimization information in wpo feedb'+
   'ack file "$1"'#000+
   'ack file "$1"'#000+
   '12002_D_Finished processing the whole program optimization information'+
   '12002_D_Finished processing the whole program optimization information'+
-  ' in wpo feedback file "$1"'#000+
-  '12003_E_Expected section header, but got "$2','" at line $1 of wpo feed'+
-  'back file'#000+
+  ' ','in wpo feedback file "$1"'#000+
+  '12003_E_Expected section header, but got "$2" at line $1 of wpo feedba'+
+  'ck file'#000+
   '12004_W_No handler registered for whole program optimization section "'+
   '12004_W_No handler registered for whole program optimization section "'+
   '$2" at line $1 of wpo feedback file, ignoring'#000+
   '$2" at line $1 of wpo feedback file, ignoring'#000+
-  '12005_D_Found whole program optimization section "$1" with information'+
-  ' about "$2"'#000+
-  '12006_F_','The selected whole program optimizations require a previousl'+
-  'y generated feedback file (use -Fw to specify)'#000+
-  '12007_E_No collected information necessary to perform "$1" whole progr'+
-  'am optimization found'#000+
-  '12008_F_Specify a whole program optimizat','ion feedback file to store '+
-  'the generated info in (using -FW)'#000+
+  '12005_D_Found whole ','program optimization section "$1" with informati'+
+  'on about "$2"'#000+
+  '12006_F_The selected whole program optimizations require a previously '+
+  'generated feedback file (use -Fw to specify)'#000+
+  '12007_E_No collected information necessary to perform "$1" whol','e pro'+
+  'gram optimization found'#000+
+  '12008_F_Specify a whole program optimization feedback file to store th'+
+  'e generated info in (using -FW)'#000+
   '12009_E_Not generating any whole program optimization information, yet'+
   '12009_E_Not generating any whole program optimization information, yet'+
-  ' a feedback file was specified (using -FW)'#000+
-  '12010_E_Not performing any whole program optimizations, yet an inp','ut'+
-  ' feedback file was specified (using -Fw)'#000+
+  ' a feedback file was specified (using -','FW)'#000+
+  '12010_E_Not performing any whole program optimizations, yet an input f'+
+  'eedback file was specified (using -Fw)'#000+
   '12011_D_Skipping whole program optimization section "$1", because not '+
   '12011_D_Skipping whole program optimization section "$1", because not '+
   'needed by the requested optimizations'#000+
   'needed by the requested optimizations'#000+
-  '12012_W_Overriding previously read information for "$1" from feedback '+
-  'input file using in','formation in section "$2"'#000+
+  '12012_W_Overriding ','previously read information for "$1" from feedbac'+
+  'k input file using information in section "$2"'#000+
   '12013_E_Cannot extract symbol liveness information from program when s'+
   '12013_E_Cannot extract symbol liveness information from program when s'+
   'tripping symbols, use -Xs-'#000+
   'tripping symbols, use -Xs-'#000+
-  '12014_E_Cannot extract symbol liveness information from program when w'+
-  'hen not linking'#000+
-  '12015_F_Cannot find "$1" or "$2','" to extract symbol liveness informat'+
-  'ion from linked program'#000+
+  '12014_E_Cannot extract symbol liveness informat','ion from program when'+
+  ' when not linking'#000+
+  '12015_F_Cannot find "$1" or "$2" to extract symbol liveness informatio'+
+  'n from linked program'#000+
   '12016_E_Error during reading symbol liveness information produced by "'+
   '12016_E_Error during reading symbol liveness information produced by "'+
   '$1"'#000+
   '$1"'#000+
-  '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
-  'ion from linked program'#000+
-  '12018_E_Col','lection of symbol liveness information can only help when'+
-  ' using smart linking, use -CX -XX'#000+
+  '12017_F_Error executing "$1" (exitc','ode: $2) to extract symbol inform'+
+  'ation from linked program'#000+
+  '12018_E_Collection of symbol liveness information can only help when u'+
+  'sing smart linking, use -CX -XX'#000+
   '12019_E_Cannot create specified whole program optimisation feedback fi'+
   '12019_E_Cannot create specified whole program optimisation feedback fi'+
   'le "$1"'#000+
   'le "$1"'#000+
-  '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
-  'C','PU'#010+
+  '1','1023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $F'+
+  'PCCPU'#010+
   'Copyright (c) 1993-2009 by Florian Klaempfl'#000+
   'Copyright (c) 1993-2009 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   #010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   #010+
   #010+
-  'Supported targets:'#010+
+  'Supported targe','ts:'#010+
   '  $OSTARGETS'#010+
   '  $OSTARGETS'#010+
   #010+
   #010+
   'Supported CPU instruction sets:'#010+
   'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   '  $INSTRUCTIONSETS'#010+
-  #010,
+  #010+
   'Supported FPU instruction sets:'#010+
   'Supported FPU instruction sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   #010+
   #010+
@@ -959,297 +979,296 @@ const msgtxt : array[0..000221,1..240] of char=(
   'Supported Optimizations:'#010+
   'Supported Optimizations:'#010+
   '  $OPTIMIZATIONS'#010+
   '  $OPTIMIZATIONS'#010+
   #010+
   #010+
-  'Supported Whole Program Optimizations:'#010+
+  'Supported Whole Program Optimizati','ons:'#010+
   '  All'#010+
   '  All'#010+
   '  $WPOPTIMIZATIONS'#010+
   '  $WPOPTIMIZATIONS'#010+
   #010+
   #010+
   'Supported Microcontroller types:'#010+
   'Supported Microcontroller types:'#010+
-  '  $CON','TROLLERTYPES'#010+
+  '  $CONTROLLERTYPES'#010+
   #010+
   #010+
   'This program comes under the GNU General Public Licence'#010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   'For more information read COPYING.FPC'#010+
   #010+
   #010+
   'Report bugs, suggestions, etc. to:'#010+
   'Report bugs, suggestions, etc. to:'#010+
-  '                 http://bugs.freepascal.org'#010+
+  '                 http://bu','gs.freepascal.org'#010+
   'or'#010+
   'or'#010+
   '                 [email protected]'#000+
   '                 [email protected]'#000+
-  '11025_**0*_P','ut + after a boolean switch option to enable it, - to di'+
-  'sable it'#010+
+  '11025_**0*_Put + after a boolean switch option to enable it, - to disa'+
+  'ble it'#010+
   '**1a_The compiler doesn'#039't delete the generated assembler file'#010+
   '**1a_The compiler doesn'#039't delete the generated assembler file'#010+
-  '**2al_List sourcecode lines in assembler file'#010+
+  '**2al_List sourcecode lines in assembler fi','le'#010+
   '**2an_List node info in assembler file'#010+
   '**2an_List node info in assembler file'#010+
-  '*L2ap_Use pipes instead of c','reating temporary assembler files'#010+
+  '*L2ap_Use pipes instead of creating temporary assembler files'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
   '**2at_List temp allocation/release info in assembler file'#010+
   '**2at_List temp allocation/release info in assembler file'#010+
-  '**1A<x>_Output format:'#010+
+  '**1A<x>_Output f','ormat:'#010+
   '**2Adefault_Use default assembler'#010+
   '**2Adefault_Use default assembler'#010+
-  '3*2Aas_Assemble using GNU AS'#010,
+  '3*2Aas_Assemble using GNU AS'#010+
   '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
   '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
   '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
-  '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
+  '3*2Anasmwdosx_Win32/WDOSX object file usin','g Nasm'#010+
   '3*2Awasm_Obj file using Wasm (Watcom)'#010+
   '3*2Awasm_Obj file using Wasm (Watcom)'#010+
-  '3*2Anasmobj_Obj file usin','g Nasm'#010+
+  '3*2Anasmobj_Obj file using Nasm'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
   '3*2Aelf_ELF (Linux) using internal writer'#010+
   '3*2Aelf_ELF (Linux) using internal writer'#010+
-  '3*2Acoff_COFF (Go32v2) using internal writer'#010+
+  '3*2Acoff_COFF (Go32v2) using internal wri','ter'#010+
   '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
   '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
-  '4*2Aas_Assemble u','sing GNU AS'#010+
+  '4*2Aas_Assemble using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amot_Standard Motorola assembler'#010+
   '6*2Amot_Standard Motorola assembler'#010+
   'A*2Aas_Assemble using GNU AS'#010+
   'A*2Aas_Assemble using GNU AS'#010+
-  'P*2Aas_Assemble using GNU AS'#010+
+  'P','*2Aas_Assemble using GNU AS'#010+
   'S*2Aas_Assemble using GNU AS'#010+
   'S*2Aas_Assemble using GNU AS'#010+
-  '**1b_Generate',' browser info'#010+
+  '**1b_Generate browser info'#010+
   '**2bl_Generate local symbol info'#010+
   '**2bl_Generate local symbol info'#010+
   '**1B_Build all modules'#010+
   '**1B_Build all modules'#010+
   '**1C<x>_Code generation options:'#010+
   '**1C<x>_Code generation options:'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
-  '**2Cb_Generate big-endian code'#010+
+  '**2Cb_Generate ','big-endian code'#010+
   '**2Cc<x>_Set default calling convention to <x>'#010+
   '**2Cc<x>_Set default calling convention to <x>'#010+
-  '**2CD_C','reate also dynamic library (not supported)'#010+
+  '**2CD_Create also dynamic library (not supported)'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
-  'lues'#010+
-  '**2CF<x>_Minimal floating point constant precision (default, 32, 64',')'+
-  #010+
+  'lu','es'#010+
+  '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
   '**2Cg_Generate PIC code'#010+
   '**2Cg_Generate PIC code'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
   '**2Ci_IO-checking'#010+
   '**2Cn_Omit linking stage'#010+
   '**2Cn_Omit linking stage'#010+
   '**2Co_Check overflow of integer operations'#010+
   '**2Co_Check overflow of integer operations'#010+
-  '**2CO_Check for possible overflow of integer operations'#010+
-  '**2Cp<x>_Select inst','ruction set, see fpc -i for possible values'#010+
+  '**2CO_','Check for possible overflow of integer operations'#010+
+  '**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
   '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
   'and 8'#010+
   'and 8'#010+
-  '**2Cr_Range checking'#010+
+  '**2Cr_Range checkin','g'#010+
   '**2CR_Verify object method call validity'#010+
   '**2CR_Verify object method call validity'#010+
-  '**2Cs<n>_Set stack checking',' size to <n>'#010+
+  '**2Cs<n>_Set stack checking size to <n>'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
   '**2CX_Create also smartlinked library'#010+
   '**2CX_Create also smartlinked library'#010+
   '**1d<x>_Defines the symbol <x>'#010+
   '**1d<x>_Defines the symbol <x>'#010+
   '**1D_Generate a DEF file'#010+
   '**1D_Generate a DEF file'#010+
-  '**2Dd<x>_Set description to <x>'#010+
+  '**2Dd<x>_Se','t description to <x>'#010+
   '**2Dv<x>_Set DLL version to <x>'#010+
   '**2Dv<x>_Set DLL version to <x>'#010+
-  '*O2Dw_PM applicat','ion'#010+
+  '*O2Dw_PM application'#010+
   '**1e<x>_Set path to executable'#010+
   '**1e<x>_Set path to executable'#010+
   '**1E_Same as -Cn'#010+
   '**1E_Same as -Cn'#010+
   '**1fPIC_Same as -Cg'#010+
   '**1fPIC_Same as -Cg'#010+
   '**1F<x>_Set file names and paths:'#010+
   '**1F<x>_Set file names and paths:'#010+
-  '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
-  'sed'#010+
+  '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses ','is p'+
+  'arsed'#010+
   '**2Fc<x>_Set input codepage to <x>'#010+
   '**2Fc<x>_Set input codepage to <x>'#010+
-  '**2FC<x>_Set RC compiler ','binary name to <x>'#010+
+  '**2FC<x>_Set RC compiler binary name to <x>'#010+
   '**2Fd_Disable the compiler'#039's internal directory cache'#010+
   '**2Fd_Disable the compiler'#039's internal directory cache'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
-  '**2Fe<x>_Redirect error output to <x>'#010+
+  '**2Fe<x>_Redirect error output ','to <x>'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
-  '**2FE<x>_Set e','xe/unit output path to <x>'#010+
+  '**2FE<x>_Set exe/unit output path to <x>'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2FL<x>_Use <x> as dynamic linker'#010+
-  '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
-  'r'#010+
+  '**2Fm<x>_Load unicode conversion table fro','m <x>.txt in the compiler '+
+  'dir'#010+
   '**2Fo<x>_Add <x> to object path'#010+
   '**2Fo<x>_Add <x> to object path'#010+
-  '**2Fr<x>','_Load error message file <x>'#010+
+  '**2Fr<x>_Load error message file <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
-  '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
-  '**2Fw<x>_Load prev','iously stored whole-program optimization feedback '+
-  'from <x>'#010+
+  '**2FW<x>_Store g','enerated whole-program optimization feedback in <x>'#010+
+  '**2Fw<x>_Load previously stored whole-program optimization feedback fr'+
+  'om <x>'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g2gc_Generate checks for pointers'#010+
   '*g2gc_Generate checks for pointers'#010+
-  '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
-  '*g2gl_Use line info un','it (show more info with backtraces)'#010+
+  '*g2gh_Use heaptr','ace unit (for memory leak/corruption debugging)'#010+
+  '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g3godwarfsets_ Enable DWARF set debug information (breaks gdb < 6.5)'#010+
   '*g3godwarfsets_ Enable DWARF set debug information (breaks gdb < 6.5)'#010+
-  '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
-  #010+
-  '*g2gp_Preserve case in s','tabs symbol names'#010+
+  '*g3gostabsabsincludes_ St','ore absolute/full include file paths in Sta'+
+  'bs'#010+
+  '*g2gp_Preserve case in stabs symbol names'#010+
   '*g2gs_Generate Stabs debug information'#010+
   '*g2gs_Generate Stabs debug information'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
-  '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
-  '*g2gw2_Generate DWA','RFv2 debug information'#010+
+  '*g2gw','_Generate DWARFv2 debug information (same as -gw2)'#010+
+  '*g2gw2_Generate DWARFv2 debug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '**1i_Information'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iD_Return compiler date'#010+
   '**2iV_Return short compiler version'#010+
   '**2iV_Return short compiler version'#010+
-  '**2iW_Return full compiler version'#010+
+  '**2iW_Return full compile','r version'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSO_Return compiler OS'#010+
-  '**2iSP_Return compiler host proces','sor'#010+
+  '**2iSP_Return compiler host processor'#010+
   '**2iTO_Return target OS'#010+
   '**2iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1l_Write logo'#010+
   '**1l_Write logo'#010+
-  '**1M<x>_Set language mode to <x>'#010+
+  '**1M<x>_Set language mode to <x>',#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
-  '**2Mobjfpc_FPC mode with Object',' Pascal support'#010+
+  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
-  '**1n_Do not read the default config files'#010+
+  '**1n_Do not read the de','fault config files'#010+
   '**1N<x>_Node tree optimizations'#010+
   '**1N<x>_Node tree optimizations'#010+
-  '**2Nu_Unroll loops'#010,
+  '**2Nu_Unroll loops'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O-_Disable optimizations'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
-  '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
-  '**2O3_Level 3 opt','imizations (-O2 + slow optimizations)'#010+
+  '**2','O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
+  '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   'values'#010+
   'values'#010+
-  '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
-  #010+
-  '**2OW<x>_Generate whole-pro','gram optimization feedback for optimizati'+
-  'on <x>, see fpc -i for possible values'#010+
+  '**2Op<x>_Set target cpu for ','optimizing, see fpc -i for possible valu'+
+  'es'#010+
+  '**2OW<x>_Generate whole-program optimization feedback for optimization'+
+  ' <x>, see fpc -i for possible values'#010+
   '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
   '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
   'le values'#010+
   'le values'#010+
-  '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Generate profile code for gprof ','(defines FPC_PROFILE)'#010+
+  '**2Os_Opti','mize for size rather than speed'#010+
+  '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
-  '3*2Rintel_Read Intel style assembler'#010+
+  '3*2Rintel_Read Intel style assembler',#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
   '**1S<x>_Syntax options:'#010+
-  '**2S2_S','ame as -Mobjfpc'#010+
+  '**2S2_Same as -Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
   '**2Sd_Same as -Mdelphi'#010+
-  '**2Se<x>_Error options. <x> is a combination of the following:'#010+
+  '**2Se<x>_Error options. <x> is a combination of the follo','wing:'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
-  '**','3*_w : Compiler also halts after warnings'#010+
+  '**3*_w : Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_h : Compiler also halts after hints'#010+
   '**3*_h : Compiler also halts after hints'#010+
-  '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use ansistrings by default instead of shortstrings'#010,
+  '**2Sg_Enable LABEL and GOTO (default in -Mtp a','nd -Mdelphi)'#010+
+  '**2Sh_Use ansistrings by default instead of shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2SI<x>_Set interface style to <x>'#010+
   '**2SI<x>_Set interface style to <x>'#010+
-  '**3SIcom_COM compatible interface (default)'#010+
+  '**3SIcom_COM compatible interface (default',')'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**3SIcorba_CORBA compatible interface'#010+
-  '**2Sm_Support macros like C (g','lobal)'#010+
+  '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2St_Allow static keyword in objects'#010+
   '**2St_Allow static keyword in objects'#010+
-  '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
+  '**2Sx_Enable exception keywords (default in ','Delphi/ObjFPC modes)'#010+
   '**1s_Do not call assembler and linker'#010+
   '**1s_Do not call assembler and linker'#010+
-  '**2sh_Gener','ate script to link on host'#010+
+  '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '**1T<x>_Target operating system:'#010+
-  '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via ','EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Versio','n 2 of DJ Delorie DOS extender'#010+
+  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3*2Tos2_OS/2 / eComStation'#010+
+  '3*','2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
-  '3*2Tsymbian_Symbian O','S'#010+
+  '3*2Tsymbian_Symbian OS'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '3*2Twince_Windows CE'#010+
   '4*2Tlinux_Linux'#010+
   '4*2Tlinux_Linux'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tamiga_Commodore Amiga'#010+
-  '6*2Tatari_Atari ST/STe/TT'#010+
+  '6*2Tatari','_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux/m68k'#010+
   '6*2Tlinux_Linux/m68k'#010+
-  '6*2Tmacos_Macintosh m68k (not su','pported)'#010+
+  '6*2Tmacos_Macintosh m68k (not supported)'#010+
   '6*2Tpalmos_PalmOS'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
   'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
-  'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
+  'P*2Tmaco','s_Mac OS (classic) on PowerPC'#010+
   'P*2Tmorphos_MorphOS'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u','<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Undefines the symbol <x>'#010+
   '**1U_Unit options:'#010+
   '**1U_Unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
-  '**2Ur_Generate release unit files (never automatically recompiled)'#010+
+  '**2Ur_Generate release unit files (never automatically recomp','iled)'#010+
   '**2Us_Compile a system unit'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combina','tion of the following letters:'#010+
+  '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
-  '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints ','                 c : Show conditionals'#010+
+  '**2*_n : Show',' notes                  t : Show tried/used files'#010+
+  '**2*_h : Show hints                  c : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
-  '**2*_s : Show time stamps            q : Show message numbers'#010+
-  '**2*_a : Sho','w everything             x : Executable info (Win32 only'+
-  ')'#010+
+  '**2*','_s : Show time stamps            q : Show message numbers'#010+
+  '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
   '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
   '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
   'e'#010+
   'e'#010+
-  '**2*_    with full path              v : Write fpcdebug.txt with'#010+
-  '**2*_                                    lots',' of debugging info'#010+
+  '**2*_    with full path              v :',' Write fpcdebug.txt with'#010+
+  '**2*_                                    lots of debugging info'#010+
   '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
   '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
   '3*1W<x>_Target-specific options (targets)'#010+
   '3*1W<x>_Target-specific options (targets)'#010+
   'A*1W<x>_Target-specific options (targets)'#010+
   'A*1W<x>_Target-specific options (targets)'#010+
-  'P*1W<x>_Target-specific options (targets)'#010+
-  'p*1W<x>_Target-specific options (targe','ts)'#010+
+  'P*1W<x>_Ta','rget-specific options (targets)'#010+
+  'p*1W<x>_Target-specific options (targets)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  '3*2WB_Create a relocatable image (Windows)'#010+
-  'A*2WB_Create a relocatable image (Win','dows, Symbian)'#010+
+  '3*2WB_Crea','te a relocatable image (Windows)'#010+
+  'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
-  'P*2WC_Specify console type application (Classic Mac OS)'#010+
-  '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows',')'#010+
+  'P*2WC_Specify console type application (Classi','c Mac OS)'#010+
+  '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2We_Use external resources (Darwin)'#010+
   '3*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
-  'p*2We_Use external resources (Darwin)'#010+
+  'p*2We_Use external resources (','Darwin)'#010+
   '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
   '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
-  '3*2WG_S','pecify graphic type application (EMX, OS/2, Windows)'#010+
+  '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
-  '3*2Wi_Use internal resources (Darwin)'#010+
+  '3*2Wi_Use in','ternal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
-  'p*2Wi_','Use internal resources (Darwin)'#010+
+  'p*2Wi_Use internal resources (Darwin)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
+  'A*2WN_Do not generate relocation code, needed for debugging (Windows',')'+
+  #010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation c','ode (Windows)'#010+
+  'A*2WR_Generate relocation code (Windows)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   '3*2WX_Enable executable stack (Linux)'#010+
   '3*2WX_Enable executable stack (Linux)'#010+
   'A*2WX_Enable executable stack (Linux)'#010+
   'A*2WX_Enable executable stack (Linux)'#010+
-  'p*2WX_Enable executable stack (Linux)'#010+
+  'p*2WX_Enable executable',' stack (Linux)'#010+
   'P*2WX_Enable executable stack (Linux)'#010+
   'P*2WX_Enable executable stack (Linux)'#010+
-  '**1X_Executable o','ptions:'#010+
+  '**1X_Executable options:'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
   'ux)'#010+
   '**2Xd_Do not use standard library search path (needed for cross compil'+
   '**2Xd_Do not use standard library search path (needed for cross compil'+
   'e)'#010+
   'e)'#010+
-  '**2Xe_Use external linker'#010+
-  '**2Xg_Create debuginfo in a separate file and add a debugli','nk sectio'+
-  'n to executable'#010+
+  '**2Xe_Use exter','nal linker'#010+
+  '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
+  'to executable'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xm_Generate link map'#010+
   '**2Xm_Generate link map'#010+
-  '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
-  's '#039'main'#039')'#010+
-  '**2XP<x>_Prepend the binu','tils names with the prefix <x>'#010+
+  '**2XM<x>_Set the name of th','e '#039'main'#039' program routine (default'+
+  ' is '#039'main'#039')'#010+
+  '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
   'ile, see the ld manual for more information) (BeOS, Linux)'#010+
   'ile, see the ld manual for more information) (BeOS, Linux)'#010+
-  '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
-  ', Linux, Mac O','S, Solaris)'#010+
+  '**2XR<x>_Prepe','nd <x> to all linker search paths (BeOS, Darwin, FreeB'+
+  'SD, Linux, Mac OS, Solaris)'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
-  '**2Xt_Link with static libraries (-static is passed to linker)'#010+
-  '**2XX_Try to smartlink units             (defines FPC_L','INK_SMART)'#010+
+  '**2Xt_Link with static libraries (-static is pas','sed to linker)'#010+
+  '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1*_'#010+
   '**1?_Show this help'#010+
   '**1?_Show this help'#010+
   '**1h_Shows this help without waiting'
   '**1h_Shows this help without waiting'

+ 8 - 8
compiler/ncal.pas

@@ -125,9 +125,9 @@ interface
           constructor create(l:tnode; v : tprocsym;st : TSymtable; mp: tnode; callflags:tcallnodeflags);virtual;
           constructor create(l:tnode; v : tprocsym;st : TSymtable; mp: tnode; callflags:tcallnodeflags);virtual;
           constructor create_procvar(l,r:tnode);
           constructor create_procvar(l,r:tnode);
           constructor createintern(const name: string; params: tnode);
           constructor createintern(const name: string; params: tnode);
-          constructor createinternfromunit(const unitname, procname: string; params: tnode);
+          constructor createinternfromunit(const fromunit, procname: string; params: tnode);
           constructor createinternres(const name: string; params: tnode; res:tdef);
           constructor createinternres(const name: string; params: tnode; res:tdef);
-          constructor createinternresfromunit(const unitname, procname: string; params: tnode; res:tdef);
+          constructor createinternresfromunit(const fromunit, procname: string; params: tnode; res:tdef);
           constructor createinternreturn(const name: string; params: tnode; returnnode : tnode);
           constructor createinternreturn(const name: string; params: tnode; returnnode : tnode);
           destructor destroy;override;
           destructor destroy;override;
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
@@ -946,14 +946,14 @@ implementation
        end;
        end;
 
 
 
 
-     constructor tcallnode.createinternfromunit(const unitname, procname: string; params: tnode);
+     constructor tcallnode.createinternfromunit(const fromunit, procname: string; params: tnode);
        var
        var
          srsym: tsym;
          srsym: tsym;
          srsymtable: tsymtable;
          srsymtable: tsymtable;
        begin
        begin
-         if not searchsym_in_named_module(unitname,procname,srsym,srsymtable) or
+         if not searchsym_in_named_module(fromunit,procname,srsym,srsymtable) or
             (srsym.typ<>procsym) then
             (srsym.typ<>procsym) then
-           Message1(cg_f_unknown_compilerproc,unitname+'.'+procname);
+           Message1(cg_f_unknown_compilerproc,fromunit+'.'+procname);
          create(params,tprocsym(srsym),srsymtable,nil,[]);
          create(params,tprocsym(srsym),srsymtable,nil,[]);
        end;
        end;
 
 
@@ -974,11 +974,11 @@ implementation
       end;
       end;
 
 
 
 
-    constructor tcallnode.createinternresfromunit(const unitname, procname: string; params: tnode; res:tdef);
+    constructor tcallnode.createinternresfromunit(const fromunit, procname: string; params: tnode; res:tdef);
       var
       var
         pd : tprocdef;
         pd : tprocdef;
       begin
       begin
-        createinternfromunit(unitname,procname,params);
+        createinternfromunit(fromunit,procname,params);
         typedef:=res;
         typedef:=res;
         include(callnodeflags,cnf_typedefset);
         include(callnodeflags,cnf_typedefset);
         pd:=tprocdef(symtableprocentry.ProcdefList[0]);
         pd:=tprocdef(symtableprocentry.ProcdefList[0]);
@@ -2645,7 +2645,7 @@ implementation
 
 
           { check for hints (deprecated etc) }
           { check for hints (deprecated etc) }
           if (procdefinition.typ = procdef) then
           if (procdefinition.typ = procdef) then
-            check_hints(tprocdef(procdefinition).procsym,tprocdef(procdefinition).symoptions);
+            check_hints(tprocdef(procdefinition).procsym,tprocdef(procdefinition).symoptions,tprocdef(procdefinition).deprecatedmsg);
 
 
           { add needed default parameters }
           { add needed default parameters }
           if assigned(procdefinition) and
           if assigned(procdefinition) and

+ 6 - 4
compiler/ncgcon.pas

@@ -441,10 +441,12 @@ implementation
           else
           else
             begin
             begin
               location.value:=swapendian(Pcardinal(value_set)^);
               location.value:=swapendian(Pcardinal(value_set)^);
-              location.value:= reverse_byte (location.value         and $ff)         or
-                              (reverse_byte((location.value shr  8) and $ff) shl  8) or
-                              (reverse_byte((location.value shr 16) and $ff) shl 16) or
-                              (reverse_byte((location.value shr 24) and $ff) shl 24);
+              location.value:=aint(
+                                 reverse_byte (location.value         and $ff)         or
+                                (reverse_byte((location.value shr  8) and $ff) shl  8) or
+                                (reverse_byte((location.value shr 16) and $ff) shl 16) or
+                                (reverse_byte((location.value shr 24) and $ff) shl 24)
+                              );
             end;
             end;
           if (target_info.endian=endian_big) then
           if (target_info.endian=endian_big) then
             location.value:=location.value shr (32-resultdef.size*8);
             location.value:=location.value shr (32-resultdef.size*8);

+ 1 - 1
compiler/ncgld.pas

@@ -247,7 +247,7 @@ implementation
                        if tabsolutevarsym(symtableentry).absseg then
                        if tabsolutevarsym(symtableentry).absseg then
                          location.reference.segment:=NR_FS;
                          location.reference.segment:=NR_FS;
 {$endif i386}
 {$endif i386}
-                       location.reference.offset:=tabsolutevarsym(symtableentry).addroffset;
+                       location.reference.offset:=aint(tabsolutevarsym(symtableentry).addroffset);
                      end;
                      end;
                    toasm :
                    toasm :
                      location.reference.symbol:=current_asmdata.RefAsmSymbol(tabsolutevarsym(symtableentry).mangledname);
                      location.reference.symbol:=current_asmdata.RefAsmSymbol(tabsolutevarsym(symtableentry).mangledname);

+ 9 - 2
compiler/ncgutil.pas

@@ -160,7 +160,7 @@ implementation
     regvars,dbgbase,
     regvars,dbgbase,
     pass_1,pass_2,
     pass_1,pass_2,
     nbas,ncon,nld,nmem,nutils,
     nbas,ncon,nld,nmem,nutils,
-    tgobj,cgobj
+    tgobj,cgobj,cgcpu
 {$ifdef powerpc}
 {$ifdef powerpc}
     , cpupi
     , cpupi
 {$endif}
 {$endif}
@@ -2103,6 +2103,10 @@ implementation
         item := TCmdStrListItem(current_procinfo.procdef.aliasnames.first);
         item := TCmdStrListItem(current_procinfo.procdef.aliasnames.first);
         while assigned(item) do
         while assigned(item) do
           begin
           begin
+{$ifdef arm}
+            if current_settings.cputype in cpu_thumb2 then
+              list.concat(tai_thumb_func.create);
+{$endif arm}
             { "double link" all procedure entry symbols via .reference }
             { "double link" all procedure entry symbols via .reference }
             { directives on darwin, because otherwise the linker       }
             { directives on darwin, because otherwise the linker       }
             { sometimes strips the procedure if only on of the symbols }
             { sometimes strips the procedure if only on of the symbols }
@@ -2123,7 +2127,6 @@ implementation
             previtem:=item;
             previtem:=item;
             item := TCmdStrListItem(item.next);
             item := TCmdStrListItem(item.next);
           end;
           end;
-
         current_procinfo.procdef.procstarttai:=tai(list.last);
         current_procinfo.procdef.procstarttai:=tai(list.last);
       end;
       end;
 
 
@@ -2271,6 +2274,7 @@ implementation
 
 
     procedure gen_external_stub(list:TAsmList;pd:tprocdef;const externalname:string);
     procedure gen_external_stub(list:TAsmList;pd:tprocdef;const externalname:string);
       begin
       begin
+        create_codegen;
         { add the procedure to the al_procedures }
         { add the procedure to the al_procedures }
         maybe_new_object_file(list);
         maybe_new_object_file(list);
         new_section(list,sec_code,lower(pd.mangledname),current_settings.alignment.procalign);
         new_section(list,sec_code,lower(pd.mangledname),current_settings.alignment.procalign);
@@ -2281,6 +2285,7 @@ implementation
           list.concat(Tai_symbol.createname(pd.mangledname,AT_FUNCTION,0));
           list.concat(Tai_symbol.createname(pd.mangledname,AT_FUNCTION,0));
 
 
         cg.g_external_wrapper(list,pd,externalname);
         cg.g_external_wrapper(list,pd,externalname);
+        destroy_codegen;
       end;
       end;
 
 
 {****************************************************************************
 {****************************************************************************
@@ -2811,12 +2816,14 @@ implementation
         i   : longint;
         i   : longint;
         def : tdef;
         def : tdef;
       begin
       begin
+        create_codegen;
         for i:=0 to st.DefList.Count-1 do
         for i:=0 to st.DefList.Count-1 do
           begin
           begin
             def:=tdef(st.DefList[i]);
             def:=tdef(st.DefList[i]);
             if is_class(def) then
             if is_class(def) then
               gen_intf_wrapper(list,tobjectdef(def));
               gen_intf_wrapper(list,tobjectdef(def));
           end;
           end;
+        destroy_codegen;
       end;
       end;
 
 
 
 

+ 18 - 14
compiler/ncnv.pas

@@ -786,9 +786,6 @@ implementation
 
 
     function ttypeconvnode.typecheck_cord_to_pointer : tnode;
     function ttypeconvnode.typecheck_cord_to_pointer : tnode;
 
 
-      var
-        t : tnode;
-
       begin
       begin
         result:=nil;
         result:=nil;
         if left.nodetype=ordconstn then
         if left.nodetype=ordconstn then
@@ -807,8 +804,14 @@ implementation
                 internalerror(2001020801);
                 internalerror(2001020801);
               {$endif} {$endif}
               {$endif} {$endif}
             {$endif}
             {$endif}
-            t:=cpointerconstnode.create(TConstPtrUInt(tordconstnode(left).value.uvalue),resultdef);
-            result:=t;
+            
+            if not(nf_explicit in flags) then
+              if (tordconstnode(left).value.svalue=0) then
+                CGMessage(type_w_zero_to_nil)
+              else
+                { in Delphi mode, these aren't caught in compare_defs_ext }
+                IncompatibleTypes(left.resultdef,resultdef);
+            result:=cpointerconstnode.create(TConstPtrUInt(tordconstnode(left).value.uvalue),resultdef);
           end
           end
          else
          else
           internalerror(200104023);
           internalerror(200104023);
@@ -1700,12 +1703,8 @@ implementation
               te_convert_l3,
               te_convert_l3,
               te_convert_l4,
               te_convert_l4,
               te_convert_l5:
               te_convert_l5:
-                begin
-                  result := simplify;
-                  if assigned(result) then
-                    exit;
-                  { nothing to do }
-                end;
+                { nothing to do }
+                ;
 
 
               te_convert_operator :
               te_convert_operator :
                 begin
                 begin
@@ -1919,9 +1918,14 @@ implementation
               CGMessage(type_w_pointer_to_longint_conv_not_portable);
               CGMessage(type_w_pointer_to_longint_conv_not_portable);
           end;
           end;
 
 
-        result := simplify;
-        if assigned(result) then
-          exit;
+        { tc_cord_2_pointer still requires a type check, which
+          simplify does not do }
+        if (convtype<>tc_cord_2_pointer) then
+          begin
+            result := simplify;
+            if assigned(result) then
+              exit;
+          end;
 
 
         { now call the resultdef helper to do constant folding }
         { now call the resultdef helper to do constant folding }
         result:=typecheck_call_helper(convtype);
         result:=typecheck_call_helper(convtype);

+ 24 - 3
compiler/ncon.pas

@@ -192,6 +192,7 @@ interface
     { some helper routines }
     { some helper routines }
     function get_ordinal_value(p : tnode) : TConstExprInt;
     function get_ordinal_value(p : tnode) : TConstExprInt;
     function get_string_value(p : tnode; is_wide : boolean = false) : TConstString;
     function get_string_value(p : tnode; is_wide : boolean = false) : TConstString;
+    function compare_strings(str1, str2: pchar) : longint;
     function is_constresourcestringnode(p : tnode) : boolean;
     function is_constresourcestringnode(p : tnode) : boolean;
     function is_emptyset(p : tnode):boolean;
     function is_emptyset(p : tnode):boolean;
     function genconstsymtree(p : tconstsym) : tnode;
     function genconstsymtree(p : tconstsym) : tnode;
@@ -254,11 +255,12 @@ implementation
                 if (not is_wide) then
                 if (not is_wide) then
                   begin
                   begin
                     if ordValRecord.signed then
                     if ordValRecord.signed then
-                      stringVal := char(ordValRecord.svalue) + ''#0
+                      stringVal := char(ordValRecord.svalue)
                     else
                     else
-                      stringVal := char(ordValRecord.uvalue) + ''#0;
-                    getmem(pCharVal, length(stringVal));
+                      stringVal := char(ordValRecord.uvalue);
+                    getmem(pCharVal, length(stringVal) + 1);
                     strpcopy(pCharVal, stringVal);
                     strpcopy(pCharVal, stringVal);
+                    pCharVal[length(stringVal)] := #0;
                     get_string_value := pCharVal;
                     get_string_value := pCharVal;
                   end
                   end
                 else
                 else
@@ -317,6 +319,25 @@ implementation
           end;
           end;
       end;
       end;
 
 
+
+    function compare_strings(str1, str2: pchar) : longint;
+      var
+        minlen, len1, len2: integer;
+      begin
+        len1 := length(str1);
+        len2 := length(str2);
+        if len1 < len2 then
+          minlen := len1
+        else
+          minlen := len2;
+
+        minlen := comparebyte(str1^, str2^, minlen);
+        if minlen = 0 then
+          minlen := len1 - len2;
+        Result := minlen;
+      end;
+
+
     function is_constresourcestringnode(p : tnode) : boolean;
     function is_constresourcestringnode(p : tnode) : boolean;
       begin
       begin
         is_constresourcestringnode:=(p.nodetype=loadn) and
         is_constresourcestringnode:=(p.nodetype=loadn) and

+ 391 - 5
compiler/nflw.pas

@@ -216,17 +216,22 @@ interface
        ctryfinallynode : ttryfinallynodeclass;
        ctryfinallynode : ttryfinallynodeclass;
        connode : tonnodeclass;
        connode : tonnodeclass;
 
 
+// for-in loop helpers
+function create_type_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+function create_string_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+function create_array_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+function create_set_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+function create_enumerator_for_in_loop(hloopvar, hloopbody, expr: tnode;
+   enumerator_get, enumerator_move: tprocdef; enumerator_current: tpropertysym): tnode;
+function create_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
 
 
 implementation
 implementation
 
 
     uses
     uses
       globtype,systems,constexp,
       globtype,systems,constexp,
       cutils,verbose,globals,
       cutils,verbose,globals,
-      symconst,paramgr,defcmp,defutil,htypechk,pass_1,
-      ncal,nadd,ncon,nmem,nld,ncnv,nbas,cgobj,nutils,
-    {$ifdef prefetchnext}
-      ninl,
-    {$endif prefetchnext}
+      symconst,symtable,paramgr,defcmp,defutil,htypechk,pass_1,
+      ncal,nadd,ncon,nmem,nld,ncnv,nbas,cgobj,nutils,ninl,nset,
     {$ifdef state_tracking}
     {$ifdef state_tracking}
       nstate,
       nstate,
     {$endif}
     {$endif}
@@ -234,6 +239,387 @@ implementation
       ;
       ;
 
 
 
 
+// for-in loop helpers
+
+function create_type_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+begin
+  result:=cfornode.create(hloopvar,
+       cinlinenode.create(in_low_x,false,expr.getcopy),
+       cinlinenode.create(in_high_x,false,expr.getcopy),
+       hloopbody,
+       false);
+end;
+
+function create_string_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+var
+  loopstatement, loopbodystatement: tstatementnode;
+  loopvar, stringvar: ttempcreatenode;
+  stringindex, loopbody, forloopnode: tnode;
+begin
+  { result is a block of statements }
+  result:=internalstatements(loopstatement);
+
+  { create a temp variable for expression }
+  stringvar := ctempcreatenode.create(
+    expr.resultdef,
+    expr.resultdef.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,stringvar);
+  addstatement(loopstatement,cassignmentnode.create(ctemprefnode.create(stringvar),expr.getcopy));
+
+  { create a loop counter: signed integer with size of string length }
+  loopvar := ctempcreatenode.create(
+    sinttype,
+    sinttype.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,loopvar);
+
+  stringindex:=ctemprefnode.create(loopvar);
+
+  loopbody:=internalstatements(loopbodystatement);
+  // for-in loop variable := string_expression[index]
+  addstatement(loopbodystatement,
+      cassignmentnode.create(hloopvar, cvecnode.create(ctemprefnode.create(stringvar),stringindex)));
+
+  { add the actual statement to the loop }
+  addstatement(loopbodystatement,hloopbody);
+
+  forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
+     genintconstnode(1),
+     cinlinenode.create(in_length_x,false,ctemprefnode.create(stringvar)),
+     loopbody,
+     false);
+
+  addstatement(loopstatement,forloopnode);
+  { free the loop counter }
+  addstatement(loopstatement,ctempdeletenode.create(loopvar));
+  { free the temp variable for expression }
+  addstatement(loopstatement,ctempdeletenode.create(stringvar));
+end;
+
+function create_array_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+var
+  loopstatement, loopbodystatement: tstatementnode;
+  loopvar, arrayvar: ttempcreatenode;
+  arrayindex, lowbound, highbound, loopbody, forloopnode: tnode;
+  is_string: boolean;
+begin
+  { result is a block of statements }
+  result:=internalstatements(loopstatement);
+
+  is_string := ado_IsConstString in tarraydef(expr.resultdef).arrayoptions;
+
+  if (node_complexity(expr) > 1) and not is_open_array(expr.resultdef) then
+  begin
+    { create a temp variable for expression }
+    arrayvar := ctempcreatenode.create(
+      expr.resultdef,
+      expr.resultdef.size,
+      tt_persistent,true);
+
+    if is_string then
+    begin
+      lowbound:=genintconstnode(1);
+      highbound:=cinlinenode.create(in_length_x,false,ctemprefnode.create(arrayvar))
+    end
+    else
+    begin
+      lowbound:=cinlinenode.create(in_low_x,false,ctemprefnode.create(arrayvar));
+      highbound:=cinlinenode.create(in_high_x,false,ctemprefnode.create(arrayvar));
+    end;
+
+    addstatement(loopstatement,arrayvar);
+    addstatement(loopstatement,cassignmentnode.create(ctemprefnode.create(arrayvar),expr.getcopy));
+  end
+  else
+  begin
+    arrayvar:=nil;
+    if is_string then
+    begin
+      lowbound:=genintconstnode(1);
+      highbound:=cinlinenode.create(in_length_x,false,expr.getcopy);
+    end
+    else
+    begin
+      lowbound:=cinlinenode.create(in_low_x,false,expr.getcopy);
+      highbound:=cinlinenode.create(in_high_x,false,expr.getcopy);
+    end;
+  end;
+
+  { create a loop counter }
+  loopvar := ctempcreatenode.create(
+    tarraydef(expr.resultdef).rangedef,
+    tarraydef(expr.resultdef).rangedef.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,loopvar);
+
+  arrayindex:=ctemprefnode.create(loopvar);
+
+  loopbody:=internalstatements(loopbodystatement);
+  // for-in loop variable := array_expression[index]
+  if assigned(arrayvar) then
+    addstatement(loopbodystatement,
+        cassignmentnode.create(hloopvar,cvecnode.create(ctemprefnode.create(arrayvar),arrayindex)))
+  else
+    addstatement(loopbodystatement,
+        cassignmentnode.create(hloopvar,cvecnode.create(expr.getcopy,arrayindex)));
+
+  { add the actual statement to the loop }
+  addstatement(loopbodystatement,hloopbody);
+
+  forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
+     lowbound,
+     highbound,
+     loopbody,
+     false);
+
+  addstatement(loopstatement,forloopnode);
+  { free the loop counter }
+  addstatement(loopstatement,ctempdeletenode.create(loopvar));
+  { free the temp variable for expression if needed }
+  if arrayvar<>nil then
+    addstatement(loopstatement,ctempdeletenode.create(arrayvar));
+end;
+
+function create_set_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+var
+  loopstatement, loopbodystatement: tstatementnode;
+  loopvar, setvar: ttempcreatenode;
+  loopbody, forloopnode: tnode;
+begin
+  // first check is set is empty and if it so then skip other processing
+  if not Assigned(tsetdef(expr.resultdef).elementdef) then
+  begin
+    result:=cnothingnode.create;
+    // free unused nodes
+    hloopvar.free;
+    hloopbody.free;
+    exit;
+  end;
+  { result is a block of statements }
+  result:=internalstatements(loopstatement);
+
+  { create a temp variable for expression }
+  setvar := ctempcreatenode.create(
+    expr.resultdef,
+    expr.resultdef.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,setvar);
+  addstatement(loopstatement,cassignmentnode.create(ctemprefnode.create(setvar),expr.getcopy));
+
+  { create a loop counter }
+  loopvar := ctempcreatenode.create(
+    tsetdef(expr.resultdef).elementdef,
+    tsetdef(expr.resultdef).elementdef.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,loopvar);
+
+  // if loopvar in set then
+  // begin
+  //   hloopvar := loopvar
+  //   for-in loop body
+  // end
+
+  loopbody:=cifnode.create(
+        cinnode.create(ctemprefnode.create(loopvar),ctemprefnode.create(setvar)),
+        internalstatements(loopbodystatement),
+        nil
+  );
+
+  addstatement(loopbodystatement,cassignmentnode.create(hloopvar,ctemprefnode.create(loopvar)));
+  { add the actual statement to the loop }
+  addstatement(loopbodystatement,hloopbody);
+
+  forloopnode:=cfornode.create(ctemprefnode.create(loopvar),
+     cinlinenode.create(in_low_x,false,ctemprefnode.create(setvar)),
+     cinlinenode.create(in_high_x,false,ctemprefnode.create(setvar)),
+     loopbody,
+     false);
+
+  addstatement(loopstatement,forloopnode);
+  { free the loop counter }
+  addstatement(loopstatement,ctempdeletenode.create(loopvar));
+  { free the temp variable for expression }
+  addstatement(loopstatement,ctempdeletenode.create(setvar));
+end;
+
+function create_enumerator_for_in_loop(hloopvar, hloopbody, expr: tnode;
+   enumerator_get, enumerator_move: tprocdef; enumerator_current: tpropertysym): tnode;
+var
+  loopstatement, loopbodystatement: tstatementnode;
+  enumvar: ttempcreatenode;
+  loopbody, whileloopnode,
+  enum_get, enum_move, enum_current, enum_get_params: tnode;
+  propaccesslist: tpropaccesslist;
+  enumerator_is_class: boolean;
+  enumerator_destructor: tprocdef;
+begin
+  { result is a block of statements }
+  result:=internalstatements(loopstatement);
+
+  enumerator_is_class := is_class(enumerator_get.returndef);
+
+  { create a temp variable for enumerator }
+  enumvar := ctempcreatenode.create(
+    enumerator_get.returndef,
+    enumerator_get.returndef.size,
+    tt_persistent,true);
+
+  addstatement(loopstatement,enumvar);
+
+  if enumerator_get.proctypeoption=potype_operator then
+  begin
+    enum_get_params:=ccallparanode.create(expr.getcopy,nil);
+    enum_get:=ccallnode.create(enum_get_params, tprocsym(enumerator_get.procsym), nil, nil, []);
+    tcallnode(enum_get).procdefinition:=enumerator_get;
+    addsymref(enumerator_get.procsym);
+  end
+  else
+    enum_get:=ccallnode.create(nil, tprocsym(enumerator_get.procsym), enumerator_get.owner, expr.getcopy, []);
+
+  addstatement(loopstatement,
+    cassignmentnode.create(
+      ctemprefnode.create(enumvar),
+      enum_get
+    ));
+
+  loopbody:=internalstatements(loopbodystatement);
+  { for-in loop variable := enumerator.current }
+  if getpropaccesslist(enumerator_current,palt_read,propaccesslist) then
+  begin
+     case propaccesslist.firstsym^.sym.typ of
+       fieldvarsym :
+         begin
+            { generate access code }
+            enum_current:=ctemprefnode.create(enumvar);
+            propaccesslist_to_node(enum_current,enumerator_current.owner,propaccesslist);
+            include(enum_current.flags,nf_isproperty);
+         end;
+       procsym :
+         begin
+            { generate the method call }
+            enum_current:=ccallnode.create(nil,tprocsym(propaccesslist.firstsym^.sym),enumerator_current.owner,ctemprefnode.create(enumvar),[]);
+            include(enum_current.flags,nf_isproperty);
+         end
+       else
+         begin
+            enum_current:=cerrornode.create;
+            Message(type_e_mismatch);
+         end;
+    end;
+  end
+  else
+    enum_current:=cerrornode.create;
+
+  addstatement(loopbodystatement,
+      cassignmentnode.create(hloopvar, enum_current));
+
+  { add the actual statement to the loop }
+  addstatement(loopbodystatement,hloopbody);
+
+  enum_move:=ccallnode.create(nil, tprocsym(enumerator_move.procsym), enumerator_move.owner, ctemprefnode.create(enumvar), []);
+  whileloopnode:=cwhilerepeatnode.create(enum_move,loopbody,true,false);
+
+  if enumerator_is_class then
+  begin
+    { insert a try-finally and call the destructor for the enumerator in the finally section }
+    enumerator_destructor:=tobjectdef(enumerator_get.returndef).Finddestructor;
+    if assigned(enumerator_destructor) then
+    begin
+      whileloopnode:=ctryfinallynode.create(
+        whileloopnode, // try node
+        ccallnode.create(nil,tprocsym(enumerator_destructor.procsym), // finally node
+          enumerator_destructor.procsym.owner,ctemprefnode.create(enumvar),[]));
+    end;
+    { if getenumerator <> nil then do the loop }
+    whileloopnode:=cifnode.create(
+      caddnode.create(unequaln, ctemprefnode.create(enumvar), cnilnode.create),
+      whileloopnode,
+      nil
+      );
+  end;
+
+  addstatement(loopstatement, whileloopnode);
+
+  if is_object(enumerator_get.returndef) then
+  begin
+    // call the object destructor too
+    enumerator_destructor:=tobjectdef(enumerator_get.returndef).Finddestructor;
+    if assigned(enumerator_destructor) then
+    begin
+      addstatement(loopstatement,
+        ccallnode.create(nil,tprocsym(enumerator_destructor.procsym),
+            enumerator_destructor.procsym.owner,ctemprefnode.create(enumvar),[]));
+    end;
+  end;
+
+  { free the temp variable for enumerator }
+  addstatement(loopstatement,ctempdeletenode.create(enumvar));
+end;
+
+function create_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode;
+var
+  pd, movenext: tprocdef;
+  current: tpropertysym;
+begin
+  if expr.nodetype=typen then
+    result:=create_type_for_in_loop(hloopvar, hloopbody, expr)
+  else
+  begin
+    { loop is made for an expression }
+    // search for operator first
+    pd:=search_enumerator_operator(expr.resultdef);
+    // if there is no operator then search for class/object enumerator method
+    if (pd=nil) and (expr.resultdef.typ=objectdef) then
+      pd:=tobjectdef(expr.resultdef).search_enumerator_get;
+    if pd<>nil then
+    begin
+      // seach movenext and current symbols
+      movenext:=tobjectdef(pd.returndef).search_enumerator_move;
+      if movenext = nil then
+      begin
+        result:=cerrornode.create;
+        hloopvar.free;
+        hloopbody.free;
+        Message1(sym_e_no_enumerator_move,pd.returndef.GetTypeName);
+      end
+      else
+      begin
+        current:=tpropertysym(tobjectdef(pd.returndef).search_enumerator_current);
+        if current = nil then
+        begin
+          result:=cerrornode.create;
+          hloopvar.free;
+          hloopbody.free;
+          Message1(sym_e_no_enumerator_current,pd.returndef.GetTypeName);
+        end
+        else
+          result:=create_enumerator_for_in_loop(hloopvar, hloopbody, expr, pd, movenext, current);
+      end;
+    end
+    else
+    begin
+      case expr.resultdef.typ of
+        stringdef: result:=create_string_for_in_loop(hloopvar, hloopbody, expr);
+        arraydef: result:=create_array_for_in_loop(hloopvar, hloopbody, expr);
+        setdef: result:=create_set_for_in_loop(hloopvar, hloopbody, expr);
+      else
+        begin
+          result:=cerrornode.create;
+          hloopvar.free;
+          hloopbody.free;
+          Message1(sym_e_no_enumerator,expr.resultdef.GetTypeName);
+        end;
+      end;
+    end;
+  end;
+end;
+
 {****************************************************************************
 {****************************************************************************
                                  TLOOPNODE
                                  TLOOPNODE
 *****************************************************************************}
 *****************************************************************************}

+ 4 - 2
compiler/ninl.pas

@@ -1122,7 +1122,7 @@ implementation
         { check if codepara is valid }
         { check if codepara is valid }
         if assigned(codepara) and
         if assigned(codepara) and
            (
            (
-            (codepara.resultdef.typ <> orddef)
+            not is_integer(codepara.resultdef)
 {$ifndef cpu64bitaddr}
 {$ifndef cpu64bitaddr}
             or is_64bitint(codepara.resultdef)
             or is_64bitint(codepara.resultdef)
 {$endif not cpu64bitaddr}
 {$endif not cpu64bitaddr}
@@ -1133,7 +1133,9 @@ implementation
           end;
           end;
 
 
         { check if dest para is valid }
         { check if dest para is valid }
-        if not(destpara.resultdef.typ in [orddef,floatdef,enumdef]) then
+        if not is_integer(destpara.resultdef) and
+           not is_currency(destpara.resultdef) and
+           not(destpara.resultdef.typ in [floatdef,enumdef]) then
           begin
           begin
             CGMessagePos(destpara.fileinfo,type_e_integer_or_real_expr_expected);
             CGMessagePos(destpara.fileinfo,type_e_integer_or_real_expr_expected);
             exit;
             exit;

+ 14 - 12
compiler/nobj.pas

@@ -271,6 +271,11 @@ implementation
             { compare parameter types only, no specifiers yet }
             { compare parameter types only, no specifiers yet }
             hasequalpara:=(compare_paras(vmtpd.paras,pd.paras,cp_none,[])>=te_equal);
             hasequalpara:=(compare_paras(vmtpd.paras,pd.paras,cp_none,[])>=te_equal);
 
 
+            { check that we are not trying to override a final method }
+            if (po_finalmethod in vmtpd.procoptions) and 
+               hasequalpara and (po_overridingmethod in pd.procoptions) and is_class(_class) then
+              MessagePos1(pd.fileinfo,parser_e_final_can_no_be_overridden,pd.fullprocname(false))
+            else
             { old definition has virtual
             { old definition has virtual
               new definition has no virtual or override }
               new definition has no virtual or override }
             if (po_virtualmethod in vmtpd.procoptions) and
             if (po_virtualmethod in vmtpd.procoptions) and
@@ -527,7 +532,7 @@ implementation
         timpls    = array[0..1000] of longint;
         timpls    = array[0..1000] of longint;
         pimpls    = ^timpls;
         pimpls    = ^timpls;
       var
       var
-        equals: pequals;
+        aequals: pequals;
         compats: pcompintfs;
         compats: pcompintfs;
         impls: pimpls;
         impls: pimpls;
         ImplIntfCount,
         ImplIntfCount,
@@ -541,10 +546,10 @@ implementation
         if ImplIntfCount>=High(tequals) then
         if ImplIntfCount>=High(tequals) then
           Internalerror(200006135);
           Internalerror(200006135);
         getmem(compats,sizeof(tcompintfentry)*ImplIntfCount);
         getmem(compats,sizeof(tcompintfentry)*ImplIntfCount);
-        getmem(equals,sizeof(longint)*ImplIntfCount);
+        getmem(aequals,sizeof(longint)*ImplIntfCount);
         getmem(impls,sizeof(longint)*ImplIntfCount);
         getmem(impls,sizeof(longint)*ImplIntfCount);
         filldword(compats^,(sizeof(tcompintfentry) div sizeof(dword))*ImplIntfCount,dword(-1));
         filldword(compats^,(sizeof(tcompintfentry) div sizeof(dword))*ImplIntfCount,dword(-1));
-        filldword(equals^,ImplIntfCount,dword(-1));
+        filldword(aequals^,ImplIntfCount,dword(-1));
         filldword(impls^,ImplIntfCount,dword(-1));
         filldword(impls^,ImplIntfCount,dword(-1));
         { ismergepossible is a containing relation
         { ismergepossible is a containing relation
           meaning of ismergepossible(a,b,w) =
           meaning of ismergepossible(a,b,w) =
@@ -563,8 +568,8 @@ implementation
                 if cij and cji then { i equal j }
                 if cij and cji then { i equal j }
                   begin
                   begin
                     { get minimum index of equal }
                     { get minimum index of equal }
-                    if equals^[j]=-1 then
-                      equals^[j]:=i;
+                    if aequals^[j]=-1 then
+                      aequals^[j]:=i;
                   end
                   end
                 else if cij then
                 else if cij then
                   begin
                   begin
@@ -601,8 +606,8 @@ implementation
             begin
             begin
               if compats^[impls^[i]].compintf<>-1 then
               if compats^[impls^[i]].compintf<>-1 then
                 impls^[i]:=compats^[impls^[i]].compintf
                 impls^[i]:=compats^[impls^[i]].compintf
-              else if equals^[impls^[i]]<>-1 then
-                impls^[i]:=equals^[impls^[i]]
+              else if aequals^[impls^[i]]<>-1 then
+                impls^[i]:=aequals^[impls^[i]]
               else
               else
                 inc(k);
                 inc(k);
             end;
             end;
@@ -614,7 +619,7 @@ implementation
             ImplIntfI.VtblImplIntf:=TImplementedInterface(_class.ImplementedInterfaces[impls^[i]]);
             ImplIntfI.VtblImplIntf:=TImplementedInterface(_class.ImplementedInterfaces[impls^[i]]);
           end;
           end;
         freemem(compats);
         freemem(compats);
-        freemem(equals);
+        freemem(aequals);
         freemem(impls);
         freemem(impls);
       end;
       end;
 
 
@@ -1452,10 +1457,7 @@ implementation
             { pointer to field table }
             { pointer to field table }
             current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(fieldtablelabel));
             current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(fieldtablelabel));
             { pointer to type info of published section }
             { pointer to type info of published section }
-            if (oo_can_have_published in _class.objectoptions) then
-              current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(RTTIWriter.get_rtti_label(_class,fullrtti)))
-            else
-              current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(nil));
+            current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(RTTIWriter.get_rtti_label(_class,fullrtti)));
             { inittable for con-/destruction }
             { inittable for con-/destruction }
             if _class.members_need_inittable then
             if _class.members_need_inittable then
               current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(RTTIWriter.get_rtti_label(_class,initrtti)))
               current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(RTTIWriter.get_rtti_label(_class,initrtti)))

+ 10 - 9
compiler/nset.pas

@@ -766,7 +766,7 @@ implementation
               condit := caddnode.create(
               condit := caddnode.create(
                 equaln, left.getcopy, cstringconstnode.createstr(labtree^._low_str));
                 equaln, left.getcopy, cstringconstnode.createstr(labtree^._low_str));
 
 
-              if (strcomp(labtree^._low_str, labtree^._high_str) <> 0) then
+              if (compare_strings(labtree^._low_str, labtree^._high_str) <> 0) then
                 begin
                 begin
                   condit.nodetype := gten;
                   condit.nodetype := gten;
                   condit := caddnode.create(
                   condit := caddnode.create(
@@ -791,10 +791,17 @@ implementation
          init_block:=nil;
          init_block:=nil;
          expectloc:=LOC_VOID;
          expectloc:=LOC_VOID;
 
 
+         { evalutes the case expression }
+         firstpass(left);
+         set_varstate(left,vs_read,[vsf_must_be_valid]);
+         if codegenerror then
+           exit;
+
          { Load caseexpr into temp var if complex. }
          { Load caseexpr into temp var if complex. }
          { No need to do this for ordinal, because }
          { No need to do this for ordinal, because }
          { in that case caseexpr is generated once }
          { in that case caseexpr is generated once }
-         if (labels^.label_type = ltConstString) and (not valid_for_addr(left, false)) then
+         if (labels^.label_type = ltConstString) and (not valid_for_addr(left, false)) and
+           (blocks.count > 0) then
            begin
            begin
              init_block := internalstatements(stmt);
              init_block := internalstatements(stmt);
              tempcaseexpr :=
              tempcaseexpr :=
@@ -811,12 +818,6 @@ implementation
              typecheckpass(left);
              typecheckpass(left);
            end;
            end;
 
 
-         { evalutes the case expression }
-         firstpass(left);
-         set_varstate(left,vs_read,[vsf_must_be_valid]);
-         if codegenerror then
-           exit;
-
          { first case }
          { first case }
          for i:=0 to blocks.count-1 do
          for i:=0 to blocks.count-1 do
            firstpass(pcaseblock(blocks[i])^.statement);
            firstpass(pcaseblock(blocks[i])^.statement);
@@ -1065,7 +1066,7 @@ implementation
           if (str_type in [cst_widestring, cst_unicodestring]) then
           if (str_type in [cst_widestring, cst_unicodestring]) then
             result := comparewidestrings(pcompilerwidestring(l), pcompilerwidestring(h))
             result := comparewidestrings(pcompilerwidestring(l), pcompilerwidestring(h))
           else
           else
-            result := strcomp(l, h);
+            result := compare_strings(l, h);
         end;
         end;
 
 
       var
       var

+ 24 - 0
compiler/nutils.pas

@@ -86,6 +86,7 @@ interface
       containing no code }
       containing no code }
     function has_no_code(n : tnode) : boolean;
     function has_no_code(n : tnode) : boolean;
 
 
+    function getpropaccesslist(propsym:tpropertysym; pap:tpropaccesslisttypes;out propaccesslist:tpropaccesslist):boolean;
     procedure propaccesslist_to_node(var p1:tnode;st:TSymtable;pl:tpropaccesslist);
     procedure propaccesslist_to_node(var p1:tnode;st:TSymtable;pl:tpropaccesslist);
     function node_to_propaccesslist(p1:tnode):tpropaccesslist;
     function node_to_propaccesslist(p1:tnode):tpropaccesslist;
 
 
@@ -344,6 +345,10 @@ implementation
       var
       var
         pd : tprocdef;
         pd : tprocdef;
       begin
       begin
+        result:=nil;
+        { is not assigned while parsing a property }
+        if not assigned(current_procinfo) then
+          exit;
         { we can't use searchsym here, because the
         { we can't use searchsym here, because the
           symtablestack is not fully setup when pass1
           symtablestack is not fully setup when pass1
           is run for nested procedures }
           is run for nested procedures }
@@ -924,6 +929,25 @@ implementation
       end;
       end;
 
 
 
 
+    function getpropaccesslist(propsym:tpropertysym; pap:tpropaccesslisttypes;out propaccesslist:tpropaccesslist):boolean;
+    var
+      hpropsym : tpropertysym;
+    begin
+      result:=false;
+      { find property in the overriden list }
+      hpropsym:=propsym;
+      repeat
+        propaccesslist:=hpropsym.propaccesslist[pap];
+        if not propaccesslist.empty then
+          begin
+            result:=true;
+            exit;
+          end;
+        hpropsym:=hpropsym.overridenpropsym;
+      until not assigned(hpropsym);
+    end;
+
+
     procedure propaccesslist_to_node(var p1:tnode;st:TSymtable;pl:tpropaccesslist);
     procedure propaccesslist_to_node(var p1:tnode;st:TSymtable;pl:tpropaccesslist);
       var
       var
         plist : ppropaccesslistitem;
         plist : ppropaccesslistitem;

+ 1 - 2
compiler/options.pas

@@ -82,8 +82,7 @@ uses
   comphook,
   comphook,
   symtable,scanner,rabase,
   symtable,scanner,rabase,
   wpobase,
   wpobase,
-  i_bsd
-  ;
+  i_bsd;
 
 
 const
 const
   page_size = 24;
   page_size = 24;

+ 17 - 4
compiler/pbase.pas

@@ -90,7 +90,7 @@ interface
 
 
     function try_consume_unitsym(var srsym:tsym;var srsymtable:TSymtable;var tokentoconsume : ttoken):boolean;
     function try_consume_unitsym(var srsym:tsym;var srsymtable:TSymtable;var tokentoconsume : ttoken):boolean;
 
 
-    function try_consume_hintdirective(var symopt:tsymoptions):boolean;
+    function try_consume_hintdirective(var symopt:tsymoptions; var deprecatedmsg:pshortstring):boolean;
 
 
     { just for an accurate position of the end of a procedure (PM) }
     { just for an accurate position of the end of a procedure (PM) }
     var
     var
@@ -194,7 +194,7 @@ implementation
         try_consume_unitsym(srsym,srsymtable,t);
         try_consume_unitsym(srsym,srsymtable,t);
         { if nothing found give error and return errorsym }
         { if nothing found give error and return errorsym }
         if assigned(srsym) then
         if assigned(srsym) then
-          check_hints(srsym,srsym.symoptions)
+          check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
         else
         else
           begin
           begin
             identifier_not_found(orgpattern);
             identifier_not_found(orgpattern);
@@ -227,7 +227,7 @@ implementation
         try_consume_unitsym(srsym,srsymtable,t);
         try_consume_unitsym(srsym,srsymtable,t);
         { if nothing found give error and return errorsym }
         { if nothing found give error and return errorsym }
         if assigned(srsym) then
         if assigned(srsym) then
-          check_hints(srsym,srsym.symoptions)
+          check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
         else
         else
           begin
           begin
             identifier_not_found(orgpattern);
             identifier_not_found(orgpattern);
@@ -282,12 +282,15 @@ implementation
       end;
       end;
 
 
 
 
-    function try_consume_hintdirective(var symopt:tsymoptions):boolean;
+    function try_consume_hintdirective(var symopt:tsymoptions; var deprecatedmsg:pshortstring):boolean;
+      var
+        last_is_deprecated:boolean;
       begin
       begin
         try_consume_hintdirective:=false;
         try_consume_hintdirective:=false;
         if not(m_hintdirective in current_settings.modeswitches) then
         if not(m_hintdirective in current_settings.modeswitches) then
          exit;
          exit;
         repeat
         repeat
+          last_is_deprecated:=false;
           case idtoken of
           case idtoken of
             _LIBRARY :
             _LIBRARY :
               begin
               begin
@@ -298,6 +301,7 @@ implementation
               begin
               begin
                 include(symopt,sp_hint_deprecated);
                 include(symopt,sp_hint_deprecated);
                 try_consume_hintdirective:=true;
                 try_consume_hintdirective:=true;
+                last_is_deprecated:=true;
               end;
               end;
             _EXPERIMENTAL :
             _EXPERIMENTAL :
               begin
               begin
@@ -318,6 +322,15 @@ implementation
               break;
               break;
           end;
           end;
           consume(Token);
           consume(Token);
+          { handle deprecated message }
+          if ((token=_CSTRING) or (token=_CCHAR)) and last_is_deprecated then
+            begin
+              if deprecatedmsg<>nil then
+                internalerror(200910181);
+              deprecatedmsg:=stringdup(pattern);
+              consume(token);
+              include(symopt,sp_has_deprecated_msg);
+            end;
         until false;
         until false;
       end;
       end;
 
 

+ 21 - 12
compiler/pdecl.pas

@@ -160,6 +160,7 @@ implementation
          hdef : tdef;
          hdef : tdef;
          sym : tsym;
          sym : tsym;
          dummysymoptions : tsymoptions;
          dummysymoptions : tsymoptions;
+         deprecatedmsg : pshortstring;
          storetokenpos,filepos : tfileposinfo;
          storetokenpos,filepos : tfileposinfo;
          old_block_type : tblock_type;
          old_block_type : tblock_type;
          skipequal : boolean;
          skipequal : boolean;
@@ -181,12 +182,16 @@ implementation
                    sym:=readconstant(orgname,filepos);
                    sym:=readconstant(orgname,filepos);
                    { Support hint directives }
                    { Support hint directives }
                    dummysymoptions:=[];
                    dummysymoptions:=[];
-                   try_consume_hintdirective(dummysymoptions);
+                   deprecatedmsg:=nil;
+                   try_consume_hintdirective(dummysymoptions,deprecatedmsg);
                    if assigned(sym) then
                    if assigned(sym) then
                      begin
                      begin
                        sym.symoptions:=sym.symoptions+dummysymoptions;
                        sym.symoptions:=sym.symoptions+dummysymoptions;
+                       sym.deprecatedmsg:=deprecatedmsg;
                        symtablestack.top.insert(sym);
                        symtablestack.top.insert(sym);
-                     end;
+                     end
+                   else
+                     stringdispose(deprecatedmsg);
                    consume(_SEMICOLON);
                    consume(_SEMICOLON);
                 end;
                 end;
 
 
@@ -475,7 +480,7 @@ implementation
               case hdef.typ of
               case hdef.typ of
                 pointerdef :
                 pointerdef :
                   begin
                   begin
-                    try_consume_hintdirective(newtype.symoptions);
+                    try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                     consume(_SEMICOLON);
                     consume(_SEMICOLON);
                     if try_to_consume(_FAR) then
                     if try_to_consume(_FAR) then
                      begin
                      begin
@@ -488,25 +493,25 @@ implementation
                     { in case of type renaming, don't parse proc directives }
                     { in case of type renaming, don't parse proc directives }
                     if istyperenaming then
                     if istyperenaming then
                       begin
                       begin
-                        try_consume_hintdirective(newtype.symoptions);
+                        try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                         consume(_SEMICOLON);
                         consume(_SEMICOLON);
                       end
                       end
                     else
                     else
                      begin
                      begin
                        if not check_proc_directive(true) then
                        if not check_proc_directive(true) then
                          begin
                          begin
-                           try_consume_hintdirective(newtype.symoptions);
+                           try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                            consume(_SEMICOLON);
                            consume(_SEMICOLON);
                          end;
                          end;
                        parse_var_proc_directives(tsym(newtype));
                        parse_var_proc_directives(tsym(newtype));
                        handle_calling_convention(tprocvardef(hdef));
                        handle_calling_convention(tprocvardef(hdef));
-                       if try_consume_hintdirective(newtype.symoptions) then
+                       if try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg) then
                          consume(_SEMICOLON);
                          consume(_SEMICOLON);
                      end;
                      end;
                   end;
                   end;
                 objectdef :
                 objectdef :
                   begin
                   begin
-                    try_consume_hintdirective(newtype.symoptions);
+                    try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                     consume(_SEMICOLON);
                     consume(_SEMICOLON);
 
 
                     { we have to know whether the class or protocol is
                     { we have to know whether the class or protocol is
@@ -534,16 +539,15 @@ implementation
                     }
                     }
                     if is_objc_class_or_protocol(hdef) then
                     if is_objc_class_or_protocol(hdef) then
                       tobjectdef(hdef).finish_objc_data;
                       tobjectdef(hdef).finish_objc_data;
-
                   end;
                   end;
                 recorddef :
                 recorddef :
                   begin
                   begin
-                    try_consume_hintdirective(newtype.symoptions);
+                    try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                     consume(_SEMICOLON);
                     consume(_SEMICOLON);
                   end;
                   end;
                 else
                 else
                   begin
                   begin
-                    try_consume_hintdirective(newtype.symoptions);
+                    try_consume_hintdirective(newtype.symoptions,newtype.deprecatedmsg);
                     consume(_SEMICOLON);
                     consume(_SEMICOLON);
                   end;
                   end;
               end;
               end;
@@ -618,6 +622,7 @@ implementation
          orgname : TIDString;
          orgname : TIDString;
          p : tnode;
          p : tnode;
          dummysymoptions : tsymoptions;
          dummysymoptions : tsymoptions;
+         deprecatedmsg : pshortstring;
          storetokenpos,filepos : tfileposinfo;
          storetokenpos,filepos : tfileposinfo;
          old_block_type : tblock_type;
          old_block_type : tblock_type;
          sp : pchar;
          sp : pchar;
@@ -666,12 +671,16 @@ implementation
                    current_tokenpos:=storetokenpos;
                    current_tokenpos:=storetokenpos;
                    { Support hint directives }
                    { Support hint directives }
                    dummysymoptions:=[];
                    dummysymoptions:=[];
-                   try_consume_hintdirective(dummysymoptions);
+                   deprecatedmsg:=nil;
+                   try_consume_hintdirective(dummysymoptions,deprecatedmsg);
                    if assigned(sym) then
                    if assigned(sym) then
                      begin
                      begin
                        sym.symoptions:=sym.symoptions+dummysymoptions;
                        sym.symoptions:=sym.symoptions+dummysymoptions;
+                       sym.deprecatedmsg:=deprecatedmsg;
                        symtablestack.top.insert(sym);
                        symtablestack.top.insert(sym);
-                     end;
+                     end
+                   else
+                     stringdispose(deprecatedmsg);
                    consume(_SEMICOLON);
                    consume(_SEMICOLON);
                    p.free;
                    p.free;
                 end;
                 end;

+ 60 - 4
compiler/pdecobj.pas

@@ -108,9 +108,34 @@ implementation
               end;
               end;
             consume(_SEMICOLON);
             consume(_SEMICOLON);
           end;
           end;
+        { parse possible enumerator modifier }
+        if try_to_consume(_ENUMERATOR) then
+          begin
+            if (token = _ID) then
+            begin
+              if pattern='CURRENT' then
+              begin
+                if oo_has_enumerator_current in current_objectdef.objectoptions then
+                  message(parser_e_only_one_enumerator_current);
+                if not p.propaccesslist[palt_read].empty then
+                begin
+                  include(current_objectdef.objectoptions,oo_has_enumerator_current);
+                  include(p.propoptions,ppo_enumerator_current);
+                end
+                else
+                  Message(parser_e_enumerator_current_is_not_valid) // property has no reader
+              end
+              else
+                Message1(parser_e_invalid_enumerator_identifier, pattern);
+              consume(token);
+            end
+            else
+              Message(parser_e_enumerator_identifier_required);
+            consume(_SEMICOLON);
+          end;
         { hint directives, these can be separated by semicolons here,
         { hint directives, these can be separated by semicolons here,
           that needs to be handled here with a loop (PFV) }
           that needs to be handled here with a loop (PFV) }
-        while try_consume_hintdirective(p.symoptions) do
+        while try_consume_hintdirective(p.symoptions,p.deprecatedmsg) do
           Consume(_SEMICOLON);
           Consume(_SEMICOLON);
       end;
       end;
 
 
@@ -257,6 +282,24 @@ implementation
         p.free;
         p.free;
       end;
       end;
 
 
+    procedure parse_object_options;
+      begin
+        if current_objectdef.objecttype = odt_class then
+          begin
+            while true do
+              begin
+                if try_to_consume(_ABSTRACT) then
+                  include(current_objectdef.objectoptions,oo_is_abstract)
+                else
+                if try_to_consume(_SEALED) then
+                  include(current_objectdef.objectoptions,oo_is_sealed)
+                else
+                  break;
+              end;
+            if [oo_is_abstract, oo_is_sealed] * current_objectdef.objectoptions = [oo_is_abstract, oo_is_sealed] then
+              Message(parser_e_abstract_and_sealed_conflict);
+          end;
+      end;
 
 
     procedure parse_parent_classes;
     procedure parse_parent_classes;
       var
       var
@@ -299,7 +342,10 @@ implementation
                             end
                             end
                           else
                           else
                             Message(parser_e_mix_of_classes_and_objects);
                             Message(parser_e_mix_of_classes_and_objects);
-                       end;
+                       end
+                     else
+                       if oo_is_sealed in childof.objectoptions then
+                         Message1(parser_e_sealed_descendant,childof.typename);
                    odt_interfacecorba,
                    odt_interfacecorba,
                    odt_interfacecom:
                    odt_interfacecom:
                      begin
                      begin
@@ -450,12 +496,19 @@ implementation
         procedure maybe_parse_hint_directives(pd:tprocdef);
         procedure maybe_parse_hint_directives(pd:tprocdef);
         var
         var
           dummysymoptions : tsymoptions;
           dummysymoptions : tsymoptions;
+          deprecatedmsg : pshortstring;
         begin
         begin
           dummysymoptions:=[];
           dummysymoptions:=[];
-          while try_consume_hintdirective(dummysymoptions) do
+          deprecatedmsg:=nil;
+          while try_consume_hintdirective(dummysymoptions,deprecatedmsg) do
             Consume(_SEMICOLON);
             Consume(_SEMICOLON);
           if assigned(pd) then
           if assigned(pd) then
-            pd.symoptions:=pd.symoptions+dummysymoptions;
+            begin
+              pd.symoptions:=pd.symoptions+dummysymoptions;
+              pd.deprecatedmsg:=deprecatedmsg;
+            end
+          else
+            stringdispose(deprecatedmsg);
         end;
         end;
 
 
       var
       var
@@ -821,6 +874,9 @@ implementation
           end
           end
         else
         else
           begin
           begin
+            { parse list of options (abstract / sealed) }
+            parse_object_options;
+
             { parse list of parent classes }
             { parse list of parent classes }
             parse_parent_classes;
             parse_parent_classes;
 
 

+ 88 - 7
compiler/pdecsub.pas

@@ -423,10 +423,11 @@ implementation
         old_block_type : tblock_type;
         old_block_type : tblock_type;
         currparast : tparasymtable;
         currparast : tparasymtable;
         parseprocvar : tppv;
         parseprocvar : tppv;
-        explicit_paraloc : boolean;
         locationstr : string;
         locationstr : string;
         paranr : integer;
         paranr : integer;
         dummytype : ttypesym;
         dummytype : ttypesym;
+        explicit_paraloc,
+        need_array: boolean;
       begin
       begin
         old_block_type:=block_type;
         old_block_type:=block_type;
         explicit_paraloc:=false;
         explicit_paraloc:=false;
@@ -525,7 +526,16 @@ implementation
            begin
            begin
              consume(_COLON);
              consume(_COLON);
              { check for an open array }
              { check for an open array }
-             if token=_ARRAY then
+             need_array:=false;
+             { bitpacked open array are not yet supported }
+             if (token=_PACKED) and
+                not(cs_bitpacking in current_settings.localswitches) then
+               begin
+                 consume(_PACKED);
+                 need_array:=true;
+               end;
+             if (token=_ARRAY) or
+                need_array then
               begin
               begin
                 consume(_ARRAY);
                 consume(_ARRAY);
                 consume(_OF);
                 consume(_OF);
@@ -1089,17 +1099,22 @@ implementation
                end
                end
               else
               else
                begin
                begin
+                 { Use the dummy NOTOKEN that is also declared
+                   for the overloaded_operator[] }
+                 optoken:=NOTOKEN;
                  case token of
                  case token of
                    _CARET:
                    _CARET:
                      Message1(parser_e_overload_operator_failed,'**');
                      Message1(parser_e_overload_operator_failed,'**');
+                   _ID:
+                     if idtoken = _ENUMERATOR then
+                       optoken := _OP_ENUMERATOR
+                     else
+                       Message1(parser_e_overload_operator_failed,'');
                    _UNEQUAL:
                    _UNEQUAL:
                      Message1(parser_e_overload_operator_failed,'=');
                      Message1(parser_e_overload_operator_failed,'=');
                    else
                    else
                      Message1(parser_e_overload_operator_failed,'');
                      Message1(parser_e_overload_operator_failed,'');
                  end;
                  end;
-                 { Use the dummy NOTOKEN that is also declared
-                   for the overloaded_operator[] }
-                 optoken:=NOTOKEN;
                end;
                end;
               consume(token);
               consume(token);
               parse_proc_head(aclass,potype_operator,pd);
               parse_proc_head(aclass,potype_operator,pd);
@@ -1284,6 +1299,9 @@ procedure pd_abstract(pd:tabstractprocdef);
 begin
 begin
   if pd.typ<>procdef then
   if pd.typ<>procdef then
     internalerror(200304269);
     internalerror(200304269);
+  if oo_is_sealed in tprocdef(pd)._class.objectoptions then
+    Message(parser_e_sealed_class_cannot_have_abstract_methods)
+  else
   if (po_virtualmethod in pd.procoptions) then
   if (po_virtualmethod in pd.procoptions) then
     include(pd.procoptions,po_abstractmethod)
     include(pd.procoptions,po_abstractmethod)
   else
   else
@@ -1292,6 +1310,44 @@ begin
   tprocdef(pd).forwarddef:=false;
   tprocdef(pd).forwarddef:=false;
 end;
 end;
 
 
+procedure pd_final(pd:tabstractprocdef);
+begin
+  if pd.typ<>procdef then
+    internalerror(200910170);
+  if (po_virtualmethod in pd.procoptions) then
+    include(pd.procoptions,po_finalmethod)
+  else
+    Message(parser_e_only_virtual_methods_final);
+end;
+
+procedure pd_enumerator(pd:tabstractprocdef);
+begin
+  if pd.typ<>procdef then
+    internalerror(200910250);
+  if (token = _ID) then
+  begin
+    if pattern='MOVENEXT' then
+    begin
+      if oo_has_enumerator_movenext in tprocdef(pd)._class.objectoptions then
+        message(parser_e_only_one_enumerator_movenext);
+      pd.calcparas;
+      if (pd.proctypeoption = potype_function) and is_boolean(pd.returndef) and
+         (pd.minparacount = 0) then
+      begin
+        include(tprocdef(pd)._class.objectoptions, oo_has_enumerator_movenext);
+        include(pd.procoptions,po_enumerator_movenext);
+      end
+      else
+        Message(parser_e_enumerator_movenext_is_not_valid)
+    end
+    else
+      Message1(parser_e_invalid_enumerator_identifier, pattern);
+    consume(token);
+  end
+  else
+    Message(parser_e_enumerator_identifier_required);
+end;
+
 procedure pd_virtual(pd:tabstractprocdef);
 procedure pd_virtual(pd:tabstractprocdef);
 {$ifdef WITHDMT}
 {$ifdef WITHDMT}
 var
 var
@@ -1376,6 +1432,8 @@ begin
   if not is_class(tprocdef(pd)._class) and
   if not is_class(tprocdef(pd)._class) and
      not is_objc_class_or_protocol(tprocdef(pd)._class) then
      not is_objc_class_or_protocol(tprocdef(pd)._class) then
     Message(parser_e_msg_only_for_classes);
     Message(parser_e_msg_only_for_classes);
+  if ([po_msgstr,po_msgint]*pd.procoptions)<>[] then
+    Message(parser_e_multiple_messages);
   { check parameter type }
   { check parameter type }
   if not is_objc_class_or_protocol(tprocdef(pd)._class) then
   if not is_objc_class_or_protocol(tprocdef(pd)._class) then
     begin
     begin
@@ -1424,7 +1482,7 @@ procedure pd_reintroduce(pd:tabstractprocdef);
 begin
 begin
   if pd.typ<>procdef then
   if pd.typ<>procdef then
     internalerror(200401211);
     internalerror(200401211);
-  if not(is_class_or_interface(tprocdef(pd)._class)) then
+  if not(is_class_or_interface_or_object(tprocdef(pd)._class)) then
     Message(parser_e_no_object_reintroduce);
     Message(parser_e_no_object_reintroduce);
 end;
 end;
 
 
@@ -1700,7 +1758,7 @@ type
    end;
    end;
 const
 const
   {Should contain the number of procedure directives we support.}
   {Should contain the number of procedure directives we support.}
-  num_proc_directives=40;
+  num_proc_directives=42;
   proc_direcdata:array[1..num_proc_directives] of proc_dir_rec=
   proc_direcdata:array[1..num_proc_directives] of proc_dir_rec=
    (
    (
     (
     (
@@ -1812,6 +1870,15 @@ const
       mutexclpocall : [];
       mutexclpocall : [];
       mutexclpotype : [];
       mutexclpotype : [];
       mutexclpo     : [po_external]
       mutexclpo     : [po_external]
+    ),(
+      idtok:_FINAL;
+      pd_flags : [pd_interface,pd_object,pd_notobjintf];
+      handler  : @pd_final;
+      pocall   : pocall_none;
+      pooption : [po_finalmethod];
+      mutexclpocall : [pocall_internproc];
+      mutexclpotype : [];
+      mutexclpo     : [po_exports,po_interrupt,po_external,po_inline]
     ),(
     ),(
       idtok:_FORWARD;
       idtok:_FORWARD;
       pd_flags : [pd_implemen,pd_notobject,pd_notobjintf];
       pd_flags : [pd_implemen,pd_notobject,pd_notobjintf];
@@ -2075,6 +2142,15 @@ const
       { allowed for external cpp classes }
       { allowed for external cpp classes }
       mutexclpotype : [{potype_constructor,potype_destructor}];
       mutexclpotype : [{potype_constructor,potype_destructor}];
       mutexclpo     : [po_public,po_exports,po_interrupt,po_assembler,po_inline]
       mutexclpo     : [po_public,po_exports,po_interrupt,po_assembler,po_inline]
+    ),(
+      idtok:_ENUMERATOR;
+      pd_flags : [pd_interface,pd_object];
+      handler  : @pd_enumerator;
+      pocall   : pocall_none;
+      pooption : [];
+      mutexclpocall : [pocall_internproc];
+      mutexclpotype : [];
+      mutexclpo     : [po_exports,po_interrupt,po_external,po_inline]
     )
     )
    );
    );
 
 
@@ -2801,6 +2877,11 @@ const
                    fwpd.fileinfo:=currpd.fileinfo;
                    fwpd.fileinfo:=currpd.fileinfo;
                    if assigned(fwpd.funcretsym) then
                    if assigned(fwpd.funcretsym) then
                      fwpd.funcretsym.fileinfo:=currpd.fileinfo;
                      fwpd.funcretsym.fileinfo:=currpd.fileinfo;
+                   if assigned(currpd.deprecatedmsg) then
+                     begin
+                       stringdispose(fwpd.deprecatedmsg);
+                       fwpd.deprecatedmsg:=stringdup(currpd.deprecatedmsg^);
+                     end;
                    { import names }
                    { import names }
                    if assigned(currpd.import_dll) then
                    if assigned(currpd.import_dll) then
                      begin
                      begin

+ 15 - 2
compiler/pdecvar.pas

@@ -88,6 +88,9 @@ implementation
                  searchsym(pattern,sym,srsymtable);
                  searchsym(pattern,sym,srsymtable);
                if assigned(sym) then
                if assigned(sym) then
                 begin
                 begin
+                  if assigned(aclass) and
+                     not is_visible_for_object(sym,aclass) then
+                    Message(parser_e_cant_access_private_member);
                   case sym.typ of
                   case sym.typ of
                     fieldvarsym :
                     fieldvarsym :
                       begin
                       begin
@@ -1137,6 +1140,7 @@ implementation
          allowdefaultvalue,
          allowdefaultvalue,
          hasdefaultvalue : boolean;
          hasdefaultvalue : boolean;
          hintsymoptions  : tsymoptions;
          hintsymoptions  : tsymoptions;
+         deprecatedmsg   : pshortstring;
          old_block_type  : tblock_type;
          old_block_type  : tblock_type;
       begin
       begin
          old_block_type:=block_type;
          old_block_type:=block_type;
@@ -1214,12 +1218,16 @@ implementation
 
 
              { try to parse the hint directives }
              { try to parse the hint directives }
              hintsymoptions:=[];
              hintsymoptions:=[];
-             try_consume_hintdirective(hintsymoptions);
+             deprecatedmsg:=nil;
+             try_consume_hintdirective(hintsymoptions,deprecatedmsg);
              for i:=0 to sc.count-1 do
              for i:=0 to sc.count-1 do
                begin
                begin
                  vs:=tabstractvarsym(sc[i]);
                  vs:=tabstractvarsym(sc[i]);
                  vs.symoptions := vs.symoptions + hintsymoptions;
                  vs.symoptions := vs.symoptions + hintsymoptions;
+                 if deprecatedmsg<>nil then
+                   vs.deprecatedmsg:=stringdup(deprecatedmsg^);
                end;
                end;
+             stringdispose(deprecatedmsg);
 
 
              { Handling of Delphi typed const = initialized vars }
              { Handling of Delphi typed const = initialized vars }
              if allowdefaultvalue and
              if allowdefaultvalue and
@@ -1315,6 +1323,7 @@ implementation
          offset : longint;
          offset : longint;
          uniondef : trecorddef;
          uniondef : trecorddef;
          hintsymoptions : tsymoptions;
          hintsymoptions : tsymoptions;
+         deprecatedmsg : pshortstring;
          semicoloneaten: boolean;
          semicoloneaten: boolean;
          is_first_field: boolean;
          is_first_field: boolean;
 {$if defined(powerpc) or defined(powerpc64)}
 {$if defined(powerpc) or defined(powerpc64)}
@@ -1402,7 +1411,8 @@ implementation
 
 
              { try to parse the hint directives }
              { try to parse the hint directives }
              hintsymoptions:=[];
              hintsymoptions:=[];
-             try_consume_hintdirective(hintsymoptions);
+             deprecatedmsg:=nil;
+             try_consume_hintdirective(hintsymoptions,deprecatedmsg);
 
 
              { mark first field }
              { mark first field }
              if (is_first_field) then
              if (is_first_field) then
@@ -1418,7 +1428,10 @@ implementation
                  fieldvs.vardef:=hdef;
                  fieldvs.vardef:=hdef;
                  { insert any additional hint directives }
                  { insert any additional hint directives }
                  fieldvs.symoptions := fieldvs.symoptions + hintsymoptions;
                  fieldvs.symoptions := fieldvs.symoptions + hintsymoptions;
+                 if deprecatedmsg<>nil then
+                   fieldvs.deprecatedmsg:=stringdup(deprecatedmsg^);
                end;
                end;
+               stringdispose(deprecatedmsg);
 
 
              { Records and objects can't have default values }
              { Records and objects can't have default values }
              { for a record there doesn't need to be a ; before the END or )    }
              { for a record there doesn't need to be a ; before the END or )    }

+ 11 - 30
compiler/pexpr.pas

@@ -1028,25 +1028,6 @@ implementation
          membercall : boolean;
          membercall : boolean;
          callflags  : tcallnodeflags;
          callflags  : tcallnodeflags;
          propaccesslist : tpropaccesslist;
          propaccesslist : tpropaccesslist;
-
-         function getpropaccesslist(pap:tpropaccesslisttypes):boolean;
-         var
-           hpropsym : tpropertysym;
-         begin
-           result:=false;
-           { find property in the overriden list }
-           hpropsym:=propsym;
-           repeat
-             propaccesslist:=hpropsym.propaccesslist[pap];
-             if not propaccesslist.empty then
-               begin
-                 result:=true;
-                 exit;
-               end;
-             hpropsym:=hpropsym.overridenpropsym;
-           until not assigned(hpropsym);
-         end;
-
       begin
       begin
          { property parameters? read them only if the property really }
          { property parameters? read them only if the property really }
          { has parameters                                             }
          { has parameters                                             }
@@ -1069,7 +1050,7 @@ implementation
          { if not(afterassignment) and not(in_args) then }
          { if not(afterassignment) and not(in_args) then }
          if token=_ASSIGNMENT then
          if token=_ASSIGNMENT then
            begin
            begin
-              if getpropaccesslist(palt_write) then
+              if getpropaccesslist(propsym,palt_write,propaccesslist) then
                 begin
                 begin
                    case propaccesslist.firstsym^.sym.typ of
                    case propaccesslist.firstsym^.sym.typ of
                      procsym :
                      procsym :
@@ -1119,7 +1100,7 @@ implementation
            end
            end
          else
          else
            begin
            begin
-              if getpropaccesslist(palt_read) then
+              if getpropaccesslist(propsym,palt_read,propaccesslist) then
                 begin
                 begin
                    case propaccesslist.firstsym^.sym.typ of
                    case propaccesslist.firstsym^.sym.typ of
                      fieldvarsym :
                      fieldvarsym :
@@ -1212,7 +1193,7 @@ implementation
                           static_name:=lower(sym.owner.name^)+'_'+sym.name;
                           static_name:=lower(sym.owner.name^)+'_'+sym.name;
                           searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable);
                           searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable);
                           if assigned(sym) then
                           if assigned(sym) then
-                            check_hints(sym,sym.symoptions);
+                            check_hints(sym,sym.symoptions,sym.deprecatedmsg);
                           p1.free;
                           p1.free;
                           p1:=nil;
                           p1:=nil;
                           { static syms are always stored as absolutevarsym to handle scope and storage properly }
                           { static syms are always stored as absolutevarsym to handle scope and storage properly }
@@ -1338,7 +1319,7 @@ implementation
                   end;
                   end;
                { if nothing found give error and return errorsym }
                { if nothing found give error and return errorsym }
                if assigned(srsym) then
                if assigned(srsym) then
-                 check_hints(srsym,srsym.symoptions)
+                 check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
                else
                else
                  begin
                  begin
                    identifier_not_found(orgstoredpattern);
                    identifier_not_found(orgstoredpattern);
@@ -1457,7 +1438,7 @@ implementation
                                  { search also in inherited methods }
                                  { search also in inherited methods }
                                  searchsym_in_class(tobjectdef(hdef),current_objectdef,pattern,srsym,srsymtable);
                                  searchsym_in_class(tobjectdef(hdef),current_objectdef,pattern,srsym,srsymtable);
                                  if assigned(srsym) then
                                  if assigned(srsym) then
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                  consume(_ID);
                                  consume(_ID);
                                  do_member_read(tobjectdef(hdef),false,srsym,p1,again,[]);
                                  do_member_read(tobjectdef(hdef),false,srsym,p1,again,[]);
                                end
                                end
@@ -1477,7 +1458,7 @@ implementation
                               srsym:=search_class_member(tobjectdef(hdef),pattern);
                               srsym:=search_class_member(tobjectdef(hdef),pattern);
                               if assigned(srsym) then
                               if assigned(srsym) then
                                 begin
                                 begin
-                                  check_hints(srsym,srsym.symoptions);
+                                  check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                   if not(getaddr) and not(sp_static in srsym.symoptions) then
                                   if not(getaddr) and not(sp_static in srsym.symoptions) then
                                     Message(sym_e_only_static_in_static)
                                     Message(sym_e_only_static_in_static)
                                   else
                                   else
@@ -1507,7 +1488,7 @@ implementation
                                 srsym:=search_class_member(tobjectdef(hdef),pattern);
                                 srsym:=search_class_member(tobjectdef(hdef),pattern);
                                 if assigned(srsym) then
                                 if assigned(srsym) then
                                  begin
                                  begin
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                    consume(_ID);
                                    consume(_ID);
                                    do_member_read(tobjectdef(hdef),getaddr,srsym,p1,again,[]);
                                    do_member_read(tobjectdef(hdef),getaddr,srsym,p1,again,[]);
                                  end
                                  end
@@ -2007,7 +1988,7 @@ implementation
                               if assigned(srsym) and
                               if assigned(srsym) and
                                  (srsym.typ=fieldvarsym) then
                                  (srsym.typ=fieldvarsym) then
                                 begin
                                 begin
-                                  check_hints(srsym,srsym.symoptions);
+                                  check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                   p1:=csubscriptnode.create(srsym,p1)
                                   p1:=csubscriptnode.create(srsym,p1)
                                 end
                                 end
                               else
                               else
@@ -2063,7 +2044,7 @@ implementation
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                if assigned(srsym) then
                                if assigned(srsym) then
                                  begin
                                  begin
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                    consume(_ID);
                                    consume(_ID);
                                    do_member_read(classh,getaddr,srsym,p1,again,[]);
                                    do_member_read(classh,getaddr,srsym,p1,again,[]);
                                  end
                                  end
@@ -2087,7 +2068,7 @@ implementation
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                if assigned(srsym) then
                                if assigned(srsym) then
                                  begin
                                  begin
-                                    check_hints(srsym,srsym.symoptions);
+                                    check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                     consume(_ID);
                                     consume(_ID);
                                     do_member_read(classh,getaddr,srsym,p1,again,[]);
                                     do_member_read(classh,getaddr,srsym,p1,again,[]);
                                  end
                                  end
@@ -2280,7 +2261,7 @@ implementation
                      end;
                      end;
                     if assigned(srsym) then
                     if assigned(srsym) then
                      begin
                      begin
-                       check_hints(srsym,srsym.symoptions);
+                       check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                        { load the procdef from the inherited class and
                        { load the procdef from the inherited class and
                          not from self }
                          not from self }
                        case srsym.typ of
                        case srsym.typ of

+ 7 - 3
compiler/powerpc/cgcpu.pas

@@ -115,6 +115,7 @@ unit cgcpu;
        procedure a_op64_reg_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64);override;
        procedure a_op64_reg_reg_reg(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64);override;
      end;
      end;
 
 
+  procedure create_codegen;
 
 
 const
 const
   TOpCG2AsmOpConstLo: Array[topcg] of TAsmOp = (A_NONE,A_MR,A_ADDI,A_ANDI_,A_DIVWU,
   TOpCG2AsmOpConstLo: Array[topcg] of TAsmOp = (A_NONE,A_MR,A_ADDI,A_ANDI_,A_DIVWU,
@@ -1870,7 +1871,10 @@ const
       end;
       end;
 
 
 
 
-begin
-  cg := tcgppc.create;
-  cg64 :=tcg64fppc.create;
+    procedure create_codegen;
+      begin
+        cg := tcgppc.create;
+        cg64 :=tcg64fppc.create;
+      end;
+      
 end.
 end.

+ 6 - 0
compiler/powerpc64/cgcpu.pas

@@ -140,6 +140,8 @@ type
     procedure profilecode_savepara(para : tparavarsym; list : TAsmList);
     procedure profilecode_savepara(para : tparavarsym; list : TAsmList);
     procedure profilecode_restorepara(para : tparavarsym; list : TAsmList);
     procedure profilecode_restorepara(para : tparavarsym; list : TAsmList);
   end;
   end;
+  
+  procedure create_codegen;
 
 
 const
 const
   TShiftOpCG2AsmOpConst : array[boolean, OP_SAR..OP_SHR] of TAsmOp = (
   TShiftOpCG2AsmOpConst : array[boolean, OP_SAR..OP_SHR] of TAsmOp = (
@@ -2158,6 +2160,10 @@ begin
   cg.a_load_ref_reg(list, OS_INT, OS_INT, ref, reg);
   cg.a_load_ref_reg(list, OS_INT, OS_INT, ref, reg);
 end;
 end;
 
 
+
+procedure create_codegen;
 begin
 begin
   cg := tcgppc.create;
   cg := tcgppc.create;
+end;
+
 end.
 end.

+ 186 - 136
compiler/pstatmnt.pas

@@ -183,8 +183,8 @@ implementation
                end;
                end;
              hl1:=0;
              hl1:=0;
              hl2:=0;
              hl2:=0;
-             sl1:='';
-             sl2:='';
+             sl1:=nil;
+             sl2:=nil;
              if (p.nodetype=rangen) then
              if (p.nodetype=rangen) then
                begin
                begin
                  { type check for string case statements }
                  { type check for string case statements }
@@ -197,7 +197,7 @@ implementation
                    if (
                    if (
                      (is_wide_or_unicode_string(casedef) and (
                      (is_wide_or_unicode_string(casedef) and (
                        comparewidestrings(pcompilerwidestring(sl1), pcompilerwidestring(sl2)) > 0)) or
                        comparewidestrings(pcompilerwidestring(sl1), pcompilerwidestring(sl2)) > 0)) or
-                     ((not is_wide_or_unicode_string(casedef)) and (strcomp(sl1, sl2) > 0))) then
+                     ((not is_wide_or_unicode_string(casedef)) and (compare_strings(sl1, sl2) > 0))) then
                      CGMessage(parser_e_case_lower_less_than_upper_bound);
                      CGMessage(parser_e_case_lower_less_than_upper_bound);
                  end
                  end
                  { type checking for ordinal case statements }
                  { type checking for ordinal case statements }
@@ -245,6 +245,29 @@ implementation
                    end;
                    end;
                end;
                end;
              p.free;
              p.free;
+             if caseofstring then
+               begin
+                 if is_wide_or_unicode_string(casedef) then
+                   begin
+                     if assigned(sl1) then
+                       donewidestring(pcompilerwidestring(sl1));
+                     if assigned(sl2) then
+                       donewidestring(pcompilerwidestring(sl2));
+                   end
+                 else
+                   begin
+                     if assigned(sl1) then
+                       begin
+                         freemem(sl1);
+                         sl1 := nil;
+                       end;
+                     if assigned(sl2) then
+                       begin
+                         freemem(sl2);
+                         sl2 := nil;
+                       end;
+                   end;
+               end;
              if token=_COMMA then
              if token=_COMMA then
                consume(_COMMA)
                consume(_COMMA)
              else
              else
@@ -340,150 +363,177 @@ implementation
 {$endif not cpu64bitaddr}
 {$endif not cpu64bitaddr}
         end;
         end;
 
 
-      var
-         hp,
-         hloopvar,
-         hblock,
-         hto,hfrom : tnode;
-         backward : boolean;
-         loopvarsym : tabstractvarsym;
-      begin
-         { parse loop header }
-         consume(_FOR);
-
-         hloopvar:=factor(false);
-         valid_for_loopvar(hloopvar,true);
-
-         { Check loop variable }
-         loopvarsym:=nil;
-
-         { variable must be an ordinal, int64 is not allowed for 32bit targets }
-         if not(is_ordinal(hloopvar.resultdef))
-{$ifndef cpu64bitaddr}
-            or is_64bitint(hloopvar.resultdef)
-{$endif not cpu64bitaddr}
-            then
-           MessagePos(hloopvar.fileinfo,type_e_ordinal_expr_expected);
-
-         hp:=hloopvar;
-         while assigned(hp) and
-               (
-                { record/object fields and array elements are allowed }
-                { in tp7 mode only                                    }
-                (
-                 (m_tp7 in current_settings.modeswitches) and
+        function for_loop_create(hloopvar: tnode): tnode;
+        var
+           hp,
+           hblock,
+           hto,hfrom : tnode;
+           backward : boolean;
+           loopvarsym : tabstractvarsym;
+        begin
+           { Check loop variable }
+           loopvarsym:=nil;
+
+           { variable must be an ordinal, int64 is not allowed for 32bit targets }
+           if not(is_ordinal(hloopvar.resultdef))
+  {$ifndef cpu64bitaddr}
+              or is_64bitint(hloopvar.resultdef)
+  {$endif not cpu64bitaddr}
+              then
+             MessagePos(hloopvar.fileinfo,type_e_ordinal_expr_expected);
+
+           hp:=hloopvar;
+           while assigned(hp) and
                  (
                  (
-                  ((hp.nodetype=subscriptn) and
-                   ((tsubscriptnode(hp).left.resultdef.typ=recorddef) or
-                    is_object(tsubscriptnode(hp).left.resultdef))
+                  { record/object fields and array elements are allowed }
+                  { in tp7 mode only                                    }
+                  (
+                   (m_tp7 in current_settings.modeswitches) and
+                   (
+                    ((hp.nodetype=subscriptn) and
+                     ((tsubscriptnode(hp).left.resultdef.typ=recorddef) or
+                      is_object(tsubscriptnode(hp).left.resultdef))
+                    ) or
+                    { constant array index }
+                    (
+                     (hp.nodetype=vecn) and
+                     is_constintnode(tvecnode(hp).right)
+                    )
+                   )
                   ) or
                   ) or
-                  { constant array index }
+                  { equal typeconversions }
                   (
                   (
-                   (hp.nodetype=vecn) and
-                   is_constintnode(tvecnode(hp).right)
+                   (hp.nodetype=typeconvn) and
+                   (ttypeconvnode(hp).convtype=tc_equal)
                   )
                   )
-                 )
-                ) or
-                { equal typeconversions }
-                (
-                 (hp.nodetype=typeconvn) and
-                 (ttypeconvnode(hp).convtype=tc_equal)
-                )
-               ) do
-           begin
-             { Use the recordfield for loopvarsym }
-             if not assigned(loopvarsym) and
-                (hp.nodetype=subscriptn) then
-               loopvarsym:=tsubscriptnode(hp).vs;
-             hp:=tunarynode(hp).left;
-           end;
+                 ) do
+             begin
+               { Use the recordfield for loopvarsym }
+               if not assigned(loopvarsym) and
+                  (hp.nodetype=subscriptn) then
+                 loopvarsym:=tsubscriptnode(hp).vs;
+               hp:=tunarynode(hp).left;
+             end;
 
 
-         if assigned(hp) and
-            (hp.nodetype=loadn) then
-           begin
-             case tloadnode(hp).symtableentry.typ of
-               staticvarsym,
-               localvarsym,
-               paravarsym :
-                 begin
-                   { we need a simple loadn:
-                       1. The load must be in a global symtable or
-                           in the same level as the para of the current proc.
-                       2. value variables (no const,out or var)
-                       3. No threadvar, readonly or typedconst
-                   }
-                   if (
-                       (tloadnode(hp).symtable.symtablelevel=main_program_level) or
-                       (tloadnode(hp).symtable.symtablelevel=current_procinfo.procdef.parast.symtablelevel)
-                      ) and
-                      (tabstractvarsym(tloadnode(hp).symtableentry).varspez=vs_value) and
-                      ([vo_is_thread_var,vo_is_typed_const] * tabstractvarsym(tloadnode(hp).symtableentry).varoptions=[]) then
-                     begin
-                       { Assigning for-loop variable is only allowed in tp7 and macpas }
-                       if ([m_tp7,m_mac] * current_settings.modeswitches = []) then
-                         begin
-                           if not assigned(loopvarsym) then
-                             loopvarsym:=tabstractvarsym(tloadnode(hp).symtableentry);
-                           include(loopvarsym.varoptions,vo_is_loop_counter);
-                         end;
-                     end
-                   else
-                     begin
-                       { Typed const is allowed in tp7 }
-                       if not(m_tp7 in current_settings.modeswitches) or
-                          not(vo_is_typed_const in tabstractvarsym(tloadnode(hp).symtableentry).varoptions) then
-                         MessagePos(hp.fileinfo,type_e_illegal_count_var);
-                     end;
-                 end;
-               else
-                 MessagePos(hp.fileinfo,type_e_illegal_count_var);
+           if assigned(hp) and
+              (hp.nodetype=loadn) then
+             begin
+               case tloadnode(hp).symtableentry.typ of
+                 staticvarsym,
+                 localvarsym,
+                 paravarsym :
+                   begin
+                     { we need a simple loadn:
+                         1. The load must be in a global symtable or
+                             in the same level as the para of the current proc.
+                         2. value variables (no const,out or var)
+                         3. No threadvar, readonly or typedconst
+                     }
+                     if (
+                         (tloadnode(hp).symtable.symtablelevel=main_program_level) or
+                         (tloadnode(hp).symtable.symtablelevel=current_procinfo.procdef.parast.symtablelevel)
+                        ) and
+                        (tabstractvarsym(tloadnode(hp).symtableentry).varspez=vs_value) and
+                        ([vo_is_thread_var,vo_is_typed_const] * tabstractvarsym(tloadnode(hp).symtableentry).varoptions=[]) then
+                       begin
+                         { Assigning for-loop variable is only allowed in tp7 and macpas }
+                         if ([m_tp7,m_mac] * current_settings.modeswitches = []) then
+                           begin
+                             if not assigned(loopvarsym) then
+                               loopvarsym:=tabstractvarsym(tloadnode(hp).symtableentry);
+                             include(loopvarsym.varoptions,vo_is_loop_counter);
+                           end;
+                       end
+                     else
+                       begin
+                         { Typed const is allowed in tp7 }
+                         if not(m_tp7 in current_settings.modeswitches) or
+                            not(vo_is_typed_const in tabstractvarsym(tloadnode(hp).symtableentry).varoptions) then
+                           MessagePos(hp.fileinfo,type_e_illegal_count_var);
+                       end;
+                   end;
+                 else
+                   MessagePos(hp.fileinfo,type_e_illegal_count_var);
+               end;
+             end
+           else
+             MessagePos(hloopvar.fileinfo,type_e_illegal_count_var);
+
+           hfrom:=comp_expr(true);
+
+           if try_to_consume(_DOWNTO) then
+             backward:=true
+           else
+             begin
+               consume(_TO);
+               backward:=false;
              end;
              end;
-           end
-         else
-           MessagePos(hloopvar.fileinfo,type_e_illegal_count_var);
 
 
-         consume(_ASSIGNMENT);
+           hto:=comp_expr(true);
+           consume(_DO);
+
+           { Check if the constants fit in the range }
+           check_range(hfrom);
+           check_range(hto);
+
+           { first set the varstate for from and to, so
+             uses of loopvar in those expressions will also
+             trigger a warning when it is not used yet. This
+             needs to be done before the instruction block is
+             parsed to have a valid hloopvar }
+           typecheckpass(hfrom);
+           set_varstate(hfrom,vs_read,[vsf_must_be_valid]);
+           typecheckpass(hto);
+           set_varstate(hto,vs_read,[vsf_must_be_valid]);
+           typecheckpass(hloopvar);
+           { in two steps, because vs_readwritten may turn on vsf_must_be_valid }
+           { for some subnodes                                                  }
+           set_varstate(hloopvar,vs_written,[]);
+           set_varstate(hloopvar,vs_read,[vsf_must_be_valid]);
+
+           { ... now the instruction block }
+           hblock:=statement;
+
+           { variable is not used for loop counter anymore }
+           if assigned(loopvarsym) then
+             exclude(loopvarsym.varoptions,vo_is_loop_counter);
+
+           result:=cfornode.create(hloopvar,hfrom,hto,hblock,backward);
+        end;
+         
+        function for_in_loop_create(hloopvar: tnode): tnode;
+        var
+          expr: tnode;
+        begin
+          expr := comp_expr(true);
 
 
-         hfrom:=comp_expr(true);
+          consume(_DO);
 
 
-         if try_to_consume(_DOWNTO) then
-           backward:=true
-         else
-           begin
-             consume(_TO);
-             backward:=false;
-           end;
+          set_varstate(hloopvar,vs_written,[]);
+          set_varstate(hloopvar,vs_read,[vsf_must_be_valid]);
+
+          result := create_for_in_loop(hloopvar, statement, expr);
+ 
+          expr.free;
+        end;
+
+      var
+         hloopvar: tnode;
+      begin
+         { parse loop header }
+         consume(_FOR);
+
+         hloopvar:=factor(false);
+         valid_for_loopvar(hloopvar,true);
 
 
-         hto:=comp_expr(true);
-         consume(_DO);
 
 
-         { Check if the constants fit in the range }
-         check_range(hfrom);
-         check_range(hto);
-
-         { first set the varstate for from and to, so
-           uses of loopvar in those expressions will also
-           trigger a warning when it is not used yet. This
-           needs to be done before the instruction block is
-           parsed to have a valid hloopvar }
-         typecheckpass(hfrom);
-         set_varstate(hfrom,vs_read,[vsf_must_be_valid]);
-         typecheckpass(hto);
-         set_varstate(hto,vs_read,[vsf_must_be_valid]);
-         typecheckpass(hloopvar);
-         { in two steps, because vs_readwritten may turn on vsf_must_be_valid }
-         { for some subnodes                                                  }
-         set_varstate(hloopvar,vs_written,[]);
-         set_varstate(hloopvar,vs_read,[vsf_must_be_valid]);
-
-         { ... now the instruction block }
-         hblock:=statement;
-
-         { variable is not used for loop counter anymore }
-         if assigned(loopvarsym) then
-           exclude(loopvarsym.varoptions,vo_is_loop_counter);
-
-         result:=cfornode.create(hloopvar,hfrom,hto,hblock,backward);
+         if try_to_consume(_ASSIGNMENT) then
+           result:=for_loop_create(hloopvar)
+         else
+         if try_to_consume(_IN) then
+           result:=for_in_loop_create(hloopvar)
+         else
+           consume(_ASSIGNMENT); // fail
       end;
       end;
 
 
 
 

+ 6 - 3
compiler/psub.pas

@@ -82,7 +82,7 @@ implementation
        globtype,tokens,verbose,comphook,constexp,
        globtype,tokens,verbose,comphook,constexp,
        systems,
        systems,
        { aasm }
        { aasm }
-       cpubase,aasmbase,aasmtai,aasmdata,
+       cpuinfo,cpubase,aasmbase,aasmtai,aasmdata,
        { symtable }
        { symtable }
        symconst,symbase,symsym,symtype,symtable,defutil,
        symconst,symbase,symsym,symtype,symtable,defutil,
        paramgr,
        paramgr,
@@ -101,7 +101,7 @@ implementation
        scanner,import,gendef,
        scanner,import,gendef,
        pbase,pstatmnt,pdecl,pdecsub,pexports,
        pbase,pstatmnt,pdecl,pdecsub,pexports,
        { codegen }
        { codegen }
-       tgobj,cgbase,cgobj,dbgbase,
+       tgobj,cgbase,cgobj,cgcpu,dbgbase,
        ncgutil,regvars,
        ncgutil,regvars,
        optbase,
        optbase,
        opttail,
        opttail,
@@ -819,6 +819,8 @@ implementation
         { only do secondpass if there are no errors }
         { only do secondpass if there are no errors }
         if (ErrorCount=0) then
         if (ErrorCount=0) then
           begin
           begin
+            create_codegen;
+
             { set the start offset to the start of the temp area in the stack }
             { set the start offset to the start of the temp area in the stack }
             tg:=ttgobj.create;
             tg:=ttgobj.create;
 
 
@@ -1136,6 +1138,7 @@ implementation
             { stop tempgen and ra }
             { stop tempgen and ra }
             tg.free;
             tg.free;
             cg.done_register_allocators;
             cg.done_register_allocators;
+            destroy_codegen;
             tg:=nil;
             tg:=nil;
           end;
           end;
 
 
@@ -1585,7 +1588,7 @@ implementation
 
 
          { hint directives, these can be separated by semicolons here,
          { hint directives, these can be separated by semicolons here,
            that needs to be handled here with a loop (PFV) }
            that needs to be handled here with a loop (PFV) }
-         while try_consume_hintdirective(pd.symoptions) do
+         while try_consume_hintdirective(pd.symoptions,pd.deprecatedmsg) do
           Consume(_SEMICOLON);
           Consume(_SEMICOLON);
 
 
          { Set calling convention }
          { Set calling convention }

+ 3 - 0
compiler/psystem.pas

@@ -580,6 +580,9 @@ implementation
 {$ifdef SPARC}
 {$ifdef SPARC}
 //        aiclass[ait_labeled_instruction]:=tai_labeled_instruction;
 //        aiclass[ait_labeled_instruction]:=tai_labeled_instruction;
 {$endif SPARC}
 {$endif SPARC}
+{$ifdef arm}
+        aiclass[ait_thumb_func]:=tai_thumb_func;
+{$endif arm}
         aiclass[ait_cutobject]:=tai_cutobject;
         aiclass[ait_cutobject]:=tai_cutobject;
         aiclass[ait_regalloc]:=tai_regalloc;
         aiclass[ait_regalloc]:=tai_regalloc;
         aiclass[ait_tempalloc]:=tai_tempalloc;
         aiclass[ait_tempalloc]:=tai_tempalloc;

+ 1 - 1
compiler/ptconst.pas

@@ -1401,7 +1401,7 @@ implementation
         read_typed_const_data(valuelist,sym.vardef);
         read_typed_const_data(valuelist,sym.vardef);
 
 
         { Parse hints }
         { Parse hints }
-        try_consume_hintdirective(sym.symoptions);
+        try_consume_hintdirective(sym.symoptions,sym.deprecatedmsg);
 
 
         consume(_SEMICOLON);
         consume(_SEMICOLON);
 
 

+ 3 - 0
compiler/rautils.pas

@@ -87,6 +87,7 @@ type
 {$ifdef arm}
 {$ifdef arm}
       OPR_REGSET    : (regset : tcpuregisterset);
       OPR_REGSET    : (regset : tcpuregisterset);
       OPR_SHIFTEROP : (shifterop : tshifterop);
       OPR_SHIFTEROP : (shifterop : tshifterop);
+      OPR_COND      : (cc : tasmcond);
 {$endif arm}
 {$endif arm}
   end;
   end;
 
 
@@ -1062,6 +1063,8 @@ end;
                 ai.loadregset(i-1,regset);
                 ai.loadregset(i-1,regset);
               OPR_SHIFTEROP:
               OPR_SHIFTEROP:
                 ai.loadshifterop(i-1,shifterop);
                 ai.loadshifterop(i-1,shifterop);
+              OPR_COND:
+                ai.loadconditioncode(i-1,cc);
 {$endif ARM}
 {$endif ARM}
               { ignore wrong operand }
               { ignore wrong operand }
               OPR_NONE:
               OPR_NONE:

+ 16 - 1
compiler/scanner.pas

@@ -391,6 +391,14 @@ implementation
            if (cs_support_exceptions in current_settings.globalswitches) then
            if (cs_support_exceptions in current_settings.globalswitches) then
              include(current_settings.modeswitches,m_except);
              include(current_settings.modeswitches,m_except);
 
 
+           { Default strict string var checking in TP/Delphi modes }
+           if ([m_delphi,m_tp7] * current_settings.modeswitches <> []) then
+             begin
+               include(current_settings.localswitches,cs_strict_var_strings);
+               if changeinit then
+                 include(init_settings.localswitches,cs_strict_var_strings);
+             end;
+
             { Undefine old symbol }
             { Undefine old symbol }
             if (m_delphi in oldmodeswitches) then
             if (m_delphi in oldmodeswitches) then
               undef_system_macro('FPC_DELPHI')
               undef_system_macro('FPC_DELPHI')
@@ -3412,7 +3420,14 @@ In case not, the value returned can be arbitrary.
                  if m_fpc in current_settings.modeswitches then
                  if m_fpc in current_settings.modeswitches then
                   begin
                   begin
                     readnumber;
                     readnumber;
-                    token:=_INTCONST;
+                    if length(pattern)=1 then
+                      begin
+                        readstring;
+                        token:=_ID;
+                        idtoken:=_ID;
+                      end
+                    else
+                      token:=_INTCONST;
                     goto exit_label;
                     goto exit_label;
                   end
                   end
                  else if m_mac in current_settings.modeswitches then
                  else if m_mac in current_settings.modeswitches then

+ 8 - 3
compiler/sparc/cgcpu.pas

@@ -106,6 +106,8 @@ interface
         procedure a_op64_const_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_const_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;value : int64;regsrc,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
         procedure a_op64_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
       end;
       end;
+      
+    procedure create_codegen;
 
 
     const
     const
       TOpCG2AsmOp : array[topcg] of TAsmOp=(
       TOpCG2AsmOp : array[topcg] of TAsmOp=(
@@ -1535,7 +1537,10 @@ implementation
       end;
       end;
 
 
 
 
-begin
-  cg:=TCgSparc.Create;
-  cg64:=TCg64Sparc.Create;
+    procedure create_codegen;
+      begin
+        cg:=TCgSparc.Create;
+        cg64:=TCg64Sparc.Create;
+      end;
+      
 end.
 end.

+ 12 - 3
compiler/symconst.pas

@@ -151,7 +151,8 @@ type
     sp_internal,  { internal symbol, not reported as unused }
     sp_internal,  { internal symbol, not reported as unused }
     sp_implicitrename,
     sp_implicitrename,
     sp_hint_experimental,
     sp_hint_experimental,
-    sp_generic_para
+    sp_generic_para,
+    sp_has_deprecated_msg
   );
   );
   tsymoptions=set of tsymoption;
   tsymoptions=set of tsymoption;
 
 
@@ -231,6 +232,7 @@ type
     po_classmethod,       { class method }
     po_classmethod,       { class method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_abstractmethod,    { Procedure is an abstract method }
     po_abstractmethod,    { Procedure is an abstract method }
+    po_finalmethod,       { Procedure is a final method }
     po_staticmethod,      { static method }
     po_staticmethod,      { static method }
     po_overridingmethod,  { method with override directive }
     po_overridingmethod,  { method with override directive }
     po_methodpointer,     { method pointer, only in procvardef, also used for 'with object do' }
     po_methodpointer,     { method pointer, only in procvardef, also used for 'with object do' }
@@ -281,7 +283,9 @@ type
     { weakly linked (i.e., may or may not exist at run time) }
     { weakly linked (i.e., may or may not exist at run time) }
     po_weakexternal,
     po_weakexternal,
     { Objective-C method }
     { Objective-C method }
-    po_objc
+    po_objc,
+    { enumerator support }
+    po_enumerator_movenext
   );
   );
   tprocoptions=set of tprocoption;
   tprocoptions=set of tprocoption;
 
 
@@ -311,6 +315,8 @@ type
   { options for objects and classes }
   { options for objects and classes }
   tobjectoption=(oo_none,
   tobjectoption=(oo_none,
     oo_is_forward,         { the class is only a forward declared yet }
     oo_is_forward,         { the class is only a forward declared yet }
+    oo_is_abstract,        { the class is abstract - only descendants can be used }
+    oo_is_sealed,          { the class is sealed - can't have descendants }
     oo_has_virtual,        { the object/class has virtual methods }
     oo_has_virtual,        { the object/class has virtual methods }
     oo_has_private,
     oo_has_private,
     oo_has_protected,
     oo_has_protected,
@@ -324,6 +330,8 @@ type
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_has_default_property,
     oo_has_default_property,
     oo_has_valid_guid,
     oo_has_valid_guid,
+    oo_has_enumerator_movenext,
+    oo_has_enumerator_current,
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
     oo_is_anonymous       { the class is only formally defined in this module (objcclass x = class; external;) }
     oo_is_anonymous       { the class is only formally defined in this module (objcclass x = class; external;) }
   );
   );
@@ -346,7 +354,8 @@ type
     ppo_defaultproperty,
     ppo_defaultproperty,
     ppo_stored,
     ppo_stored,
     ppo_hasparameters,
     ppo_hasparameters,
-    ppo_implements
+    ppo_implements,
+    ppo_enumerator_current
   );
   );
   tpropertyoptions=set of tpropertyoption;
   tpropertyoptions=set of tpropertyoption;
 
 

+ 132 - 1
compiler/symdef.pas

@@ -299,6 +299,10 @@ interface
           function FindDestructor : tprocdef;
           function FindDestructor : tprocdef;
           function implements_any_interfaces: boolean;
           function implements_any_interfaces: boolean;
           procedure reset; override;
           procedure reset; override;
+          { enumerator support }
+          function search_enumerator_get: tprocdef;
+          function search_enumerator_move: tprocdef;
+          function search_enumerator_current: tsym;
           { WPO }
           { WPO }
           procedure register_created_object_type;override;
           procedure register_created_object_type;override;
           procedure register_maybe_created_object_type;
           procedure register_maybe_created_object_type;
@@ -470,6 +474,7 @@ interface
 {$endif}
 {$endif}
           visibility : tvisibility;
           visibility : tvisibility;
           symoptions : tsymoptions;
           symoptions : tsymoptions;
+          deprecatedmsg : pshortstring;
           { symbol owning this definition }
           { symbol owning this definition }
           procsym : tsym;
           procsym : tsym;
           procsymderef : tderef;
           procsymderef : tderef;
@@ -2803,7 +2808,7 @@ implementation
            begin
            begin
              b:=ppufile.getbyte;
              b:=ppufile.getbyte;
              if b<>sizeof(funcretloc[callerside]) then
              if b<>sizeof(funcretloc[callerside]) then
-               internalerror(200411154);
+               internalerror(200411155);
              ppufile.getdata(funcretloc[callerside],sizeof(funcretloc[callerside]));
              ppufile.getdata(funcretloc[callerside],sizeof(funcretloc[callerside]));
            end;
            end;
 
 
@@ -2966,6 +2971,7 @@ implementation
          import_name:=nil;
          import_name:=nil;
          import_nr:=0;
          import_nr:=0;
          inlininginfo:=nil;
          inlininginfo:=nil;
+         deprecatedmsg:=nil;
 {$ifdef i386}
 {$ifdef i386}
           fpu_used:=maxfpuregs;
           fpu_used:=maxfpuregs;
 {$endif i386}
 {$endif i386}
@@ -2990,6 +2996,10 @@ implementation
          visibility:=tvisibility(ppufile.getbyte);
          visibility:=tvisibility(ppufile.getbyte);
          ppufile.getsmallset(symoptions);
          ppufile.getsmallset(symoptions);
          optional:=boolean(ppufile.getbyte);
          optional:=boolean(ppufile.getbyte);
+         if sp_has_deprecated_msg in symoptions then
+           deprecatedmsg:=stringdup(ppufile.getstring)
+         else
+           deprecatedmsg:=nil;
 {$ifdef powerpc}
 {$ifdef powerpc}
          { library symbol for AmigaOS/MorphOS }
          { library symbol for AmigaOS/MorphOS }
          ppufile.getderef(libsymderef);
          ppufile.getderef(libsymderef);
@@ -3090,6 +3100,7 @@ implementation
          stringdispose(resultname);
          stringdispose(resultname);
          stringdispose(import_dll);
          stringdispose(import_dll);
          stringdispose(import_name);
          stringdispose(import_name);
+         stringdispose(deprecatedmsg);
          if (po_msgstr in procoptions) then
          if (po_msgstr in procoptions) then
            stringdispose(messageinf.str);
            stringdispose(messageinf.str);
          if assigned(_mangledname) then
          if assigned(_mangledname) then
@@ -3128,6 +3139,8 @@ implementation
          ppufile.putbyte(byte(visibility));
          ppufile.putbyte(byte(visibility));
          ppufile.putsmallset(symoptions);
          ppufile.putsmallset(symoptions);
          ppufile.putbyte(byte(optional));
          ppufile.putbyte(byte(optional));
+         if sp_has_deprecated_msg in symoptions then
+           ppufile.putstring(deprecatedmsg^);
 {$ifdef powerpc}
 {$ifdef powerpc}
          { library symbol for AmigaOS/MorphOS }
          { library symbol for AmigaOS/MorphOS }
          ppufile.putderef(libsymderef);
          ppufile.putderef(libsymderef);
@@ -4418,6 +4431,119 @@ implementation
         classref_created_in_current_module:=false;
         classref_created_in_current_module:=false;
       end;
       end;
 
 
+    function tobjectdef.search_enumerator_get: tprocdef;
+     var
+        objdef : tobjectdef;
+        sym : tsym;
+        i : integer;
+        pd : tprocdef;
+        hashedid : THashedIDString;
+     begin
+        result:=nil;
+        objdef:=self;
+        hashedid.id:='GETENUMERATOR';
+        while assigned(objdef) do
+          begin
+            sym:=tsym(objdef.symtable.FindWithHash(hashedid));
+            if assigned(sym) and (sym.typ=procsym) then
+              begin
+                for i := 0 to Tprocsym(sym).ProcdefList.Count - 1 do
+                begin
+                  pd := tprocdef(Tprocsym(sym).ProcdefList[i]);
+                  if (pd.proctypeoption = potype_function) and
+                     is_class_or_interface_or_object(pd.returndef) and
+                     (pd.visibility >= vis_public) then
+                  begin
+                    result:=pd;
+                    exit;
+                  end;
+                end;
+              end;
+            objdef:=objdef.childof;
+          end;
+      end;
+
+    function tobjectdef.search_enumerator_move: tprocdef;
+     var
+        objdef : tobjectdef;
+        sym : tsym;
+        i : integer;
+        pd : tprocdef;
+        hashedid : THashedIDString;
+     begin
+        result:=nil;
+        objdef:=self;
+        // first search for po_enumerator_movenext method modifier
+        // then search for public function MoveNext: Boolean
+        hashedid.id:='MOVENEXT';
+        while assigned(objdef) do
+          begin
+            for i:=0 to objdef.symtable.SymList.Count-1 do
+              begin
+                sym:=TSym(objdef.symtable.SymList[i]);
+                if (sym.typ=procsym) then
+                begin
+                  pd:=Tprocsym(sym).find_procdef_byoptions([po_enumerator_movenext]);
+                  if assigned(pd) then
+                    begin
+                      result:=pd;
+                      exit;
+                    end;
+                end;
+              end;
+            sym:=tsym(objdef.symtable.FindWithHash(hashedid));
+            if assigned(sym) and (sym.typ=procsym) then
+              begin
+                for i := 0 to Tprocsym(sym).ProcdefList.Count - 1 do
+                begin
+                  pd := tprocdef(Tprocsym(sym).ProcdefList[i]);
+                  if (pd.proctypeoption = potype_function) and
+                     is_boolean(pd.returndef) and
+                     (pd.minparacount = 0) and
+                     (pd.visibility >= vis_public) then
+                  begin
+                    result:=pd;
+                    exit;
+                  end;
+                end;
+              end;
+            objdef:=objdef.childof;
+          end;
+      end;
+
+    function tobjectdef.search_enumerator_current: tsym;
+     var
+        objdef : tobjectdef;
+        sym: tsym;
+        i: integer;
+        hashedid : THashedIDString;
+     begin
+        result:=nil;
+        objdef:=self;
+        hashedid.id:='CURRENT';
+        // first search for ppo_enumerator_current property modifier
+        // then search for public property Current
+        while assigned(objdef) do
+          begin
+            for i:=0 to objdef.symtable.SymList.Count-1 do
+              begin
+                sym:=TSym(objdef.symtable.SymList[i]);
+                if (sym.typ=propertysym) and (ppo_enumerator_current in tpropertysym(sym).propoptions) then
+                begin
+                  result:=sym;
+                  exit;
+                end;
+              end;
+            sym:=tsym(objdef.symtable.FindWithHash(hashedid));
+            if assigned(sym) and (sym.typ=propertysym) and
+               (sym.visibility >= vis_public) and not tpropertysym(sym).propaccesslist[palt_read].empty then
+              begin
+                result:=sym;
+                exit;
+              end;
+            objdef:=objdef.childof;
+          end;
+      end;
 
 
     procedure tobjectdef.register_created_classref_type;
     procedure tobjectdef.register_created_classref_type;
       begin
       begin
@@ -4681,6 +4807,11 @@ implementation
     function TImplementedInterface.getcopy:TImplementedInterface;
     function TImplementedInterface.getcopy:TImplementedInterface;
       begin
       begin
         Result:=TImplementedInterface.Create(nil);
         Result:=TImplementedInterface.Create(nil);
+        {$warning: this is completely wrong on so many levels...}
+        { 1) the procdefs list will be freed once for each copy
+          2) since the procdefs list owns its elements, those will also be freed for each copy
+          3) idem for the name mappings
+        }
         Move(pointer(self)^,pointer(result)^,InstanceSize);
         Move(pointer(self)^,pointer(result)^,InstanceSize);
       end;
       end;
 
 

+ 94 - 3
compiler/symsym.pas

@@ -79,6 +79,8 @@ interface
           constructor create;
           constructor create;
        end;
        end;
 
 
+       { tprocsym }
+
        tprocsym = class(tstoredsym)
        tprocsym = class(tstoredsym)
        protected
        protected
           FProcdefList   : TFPObjectList;
           FProcdefList   : TFPObjectList;
@@ -97,8 +99,10 @@ interface
           procedure deref;override;
           procedure deref;override;
           function find_procdef_bytype(pt:Tproctypeoption):Tprocdef;
           function find_procdef_bytype(pt:Tproctypeoption):Tprocdef;
           function find_procdef_bypara(para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
           function find_procdef_bypara(para:TFPObjectList;retdef:tdef;cpoptions:tcompare_paras_options):Tprocdef;
+          function find_procdef_byoptions(ops:tprocoptions): Tprocdef;
           function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
           function find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
           function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
           function find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
+          function find_procdef_enumerator_operator(typedef:tdef;var besteq:tequaltype):Tprocdef;
           property ProcdefList:TFPObjectList read FProcdefList;
           property ProcdefList:TFPObjectList read FProcdefList;
        end;
        end;
 
 
@@ -362,6 +366,10 @@ implementation
          ppufile.getposinfo(fileinfo);
          ppufile.getposinfo(fileinfo);
          visibility:=tvisibility(ppufile.getbyte);
          visibility:=tvisibility(ppufile.getbyte);
          ppufile.getsmallset(symoptions);
          ppufile.getsmallset(symoptions);
+         if sp_has_deprecated_msg in symoptions then
+           deprecatedmsg:=stringdup(ppufile.getstring)
+         else
+           deprecatedmsg:=nil;
       end;
       end;
 
 
 
 
@@ -372,6 +380,8 @@ implementation
          ppufile.putposinfo(fileinfo);
          ppufile.putposinfo(fileinfo);
          ppufile.putbyte(byte(visibility));
          ppufile.putbyte(byte(visibility));
          ppufile.putsmallset(symoptions);
          ppufile.putsmallset(symoptions);
+         if sp_has_deprecated_msg in symoptions then
+           ppufile.putstring(deprecatedmsg^);
       end;
       end;
 
 
 
 
@@ -651,6 +661,22 @@ implementation
           end;
           end;
       end;
       end;
 
 
+    function tprocsym.find_procdef_byoptions(ops: tprocoptions): Tprocdef;
+      var
+        i  : longint;
+        pd : tprocdef;
+      begin
+        result:=nil;
+        for i:=0 to ProcdefList.Count-1 do
+          begin
+            pd:=tprocdef(ProcdefList[i]);
+            if ops * pd.procoptions = ops then
+              begin
+                result:=pd;
+                exit;
+              end;
+          end;
+      end;
 
 
     function Tprocsym.Find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
     function Tprocsym.Find_procdef_byprocvardef(d:Tprocvardef):Tprocdef;
       var
       var
@@ -688,8 +714,8 @@ implementation
 
 
     function Tprocsym.Find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
     function Tprocsym.Find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
       var
       var
-        paraidx,
-        i  : longint;
+        paraidx, realparamcount,
+        i, j : longint;
         bestpd,
         bestpd,
         hpd,
         hpd,
         pd : tprocdef;
         pd : tprocdef;
@@ -723,8 +749,13 @@ implementation
                       assigned(pd.paras[paraidx]) and
                       assigned(pd.paras[paraidx]) and
                       (vo_is_hidden_para in tparavarsym(pd.paras[paraidx]).varoptions) do
                       (vo_is_hidden_para in tparavarsym(pd.paras[paraidx]).varoptions) do
                   inc(paraidx);
                   inc(paraidx);
+                realparamcount:=0;
+                for j := 0 to pd.paras.Count-1 do
+                  if assigned(pd.paras[j]) and not (vo_is_hidden_para in tparavarsym(pd.paras[j]).varoptions) then
+                    inc(realparamcount);
                 if (paraidx<pd.paras.count) and
                 if (paraidx<pd.paras.count) and
-                   assigned(pd.paras[paraidx]) then
+                   assigned(pd.paras[paraidx]) and
+                   (realparamcount = 1) then
                   begin
                   begin
                     eq:=compare_defs_ext(fromdef,tparavarsym(pd.paras[paraidx]).vardef,nothingn,convtyp,hpd,[]);
                     eq:=compare_defs_ext(fromdef,tparavarsym(pd.paras[paraidx]).vardef,nothingn,convtyp,hpd,[]);
 
 
@@ -753,6 +784,66 @@ implementation
         result:=bestpd;
         result:=bestpd;
       end;
       end;
 
 
+      function Tprocsym.find_procdef_enumerator_operator(typedef:tdef;var besteq:tequaltype):Tprocdef;
+      var
+        paraidx, realparamcount,
+        i, j : longint;
+        bestpd,
+        hpd,
+        pd : tprocdef;
+        convtyp : tconverttype;
+        eq      : tequaltype;
+      begin
+        { This function will return the pprocdef of pprocsym that
+          is the best match for procvardef. When there are multiple
+          matches it returns nil.}
+        result:=nil;
+        bestpd:=nil;
+        besteq:=te_incompatible;
+        for i:=0 to ProcdefList.Count-1 do
+          begin
+            pd:=tprocdef(ProcdefList[i]);
+            paraidx:=0;
+            { ignore vs_hidden parameters }
+            while (paraidx<pd.paras.count) and
+                  assigned(pd.paras[paraidx]) and
+                  (vo_is_hidden_para in tparavarsym(pd.paras[paraidx]).varoptions) do
+              inc(paraidx);
+            realparamcount:=0;
+            for j := 0 to pd.paras.Count-1 do
+              if assigned(pd.paras[j]) and not (vo_is_hidden_para in tparavarsym(pd.paras[j]).varoptions) then
+                inc(realparamcount);
+            if (paraidx<pd.paras.count) and
+               assigned(pd.paras[paraidx]) and
+               (realparamcount = 1) and
+               is_class_or_interface_or_object(pd.returndef)  then
+              begin
+                eq:=compare_defs_ext(typedef,tparavarsym(pd.paras[paraidx]).vardef,nothingn,convtyp,hpd,[]);
+
+                { alias? if yes, only l1 choice,
+                  if you mess with this code, check tw4093 }
+                if (eq=te_exact) and
+                   (typedef<>tparavarsym(pd.paras[paraidx]).vardef) and
+                   ((df_unique in typedef.defoptions) or
+                   (df_unique in tparavarsym(pd.paras[paraidx]).vardef.defoptions)) then
+                  eq:=te_convert_l1;
+
+                if eq=te_exact then
+                  begin
+                    besteq:=eq;
+                    result:=pd;
+                    exit;
+                  end;
+                if eq>besteq then
+                  begin
+                    bestpd:=pd;
+                    besteq:=eq;
+                  end;
+              end;
+          end;
+        result:=bestpd;
+      end;
+
 
 
 {****************************************************************************
 {****************************************************************************
                                   TERRORSYM
                                   TERRORSYM

+ 40 - 2
compiler/symtable.pas

@@ -203,6 +203,7 @@ interface
     function  search_named_unit_globaltype(const unitname, typename: TIDString): ttypesym;
     function  search_named_unit_globaltype(const unitname, typename: TIDString): ttypesym;
     function  search_class_member(pd : tobjectdef;const s : string):tsym;
     function  search_class_member(pd : tobjectdef;const s : string):tsym;
     function  search_assignment_operator(from_def,to_def:Tdef):Tprocdef;
     function  search_assignment_operator(from_def,to_def:Tdef):Tprocdef;
+    function  search_enumerator_operator(type_def:Tdef):Tprocdef;
     {Looks for macro s (must be given in upper case) in the macrosymbolstack, }
     {Looks for macro s (must be given in upper case) in the macrosymbolstack, }
     {and returns it if found. Returns nil otherwise.}
     {and returns it if found. Returns nil otherwise.}
     function  search_macro(const s : string):tsym;
     function  search_macro(const s : string):tsym;
@@ -256,7 +257,7 @@ interface
           'sym_diff','starstar',
           'sym_diff','starstar',
           'as','is','in','or',
           'as','is','in','or',
           'and','div','mod','not','shl','shr','xor',
           'and','div','mod','not','shl','shr','xor',
-          'assign');
+          'assign','enumerator');
 
 
 
 
 
 
@@ -1940,6 +1941,44 @@ implementation
       end;
       end;
 
 
 
 
+    function search_enumerator_operator(type_def:Tdef): Tprocdef;
+      var
+        sym : Tprocsym;
+        hashedid : THashedIDString;
+        curreq,
+        besteq : tequaltype;
+        currpd,
+        bestpd : tprocdef;
+        stackitem : psymtablestackitem;
+      begin
+        hashedid.id:='enumerator';
+        besteq:=te_incompatible;
+        bestpd:=nil;
+        stackitem:=symtablestack.stack;
+        while assigned(stackitem) do
+          begin
+            sym:=Tprocsym(stackitem^.symtable.FindWithHash(hashedid));
+            if sym<>nil then
+              begin
+                if sym.typ<>procsym then
+                  internalerror(200910241);
+                { if the source type is an alias then this is only the second choice,
+                  if you mess with this code, check tw4093 }
+                currpd:=sym.find_procdef_enumerator_operator(type_def,curreq);
+                if curreq>besteq then
+                  begin
+                    besteq:=curreq;
+                    bestpd:=currpd;
+                    if (besteq=te_exact) then
+                      break;
+                  end;
+              end;
+            stackitem:=stackitem^.next;
+          end;
+        result:=bestpd;
+    end;
+
+
     function search_system_type(const s: TIDString): ttypesym;
     function search_system_type(const s: TIDString): ttypesym;
       var
       var
         sym : tsym;
         sym : tsym;
@@ -1994,7 +2033,6 @@ implementation
         search_class_member:=nil;
         search_class_member:=nil;
       end;
       end;
 
 
-
     function search_macro(const s : string):tsym;
     function search_macro(const s : string):tsym;
       var
       var
         stackitem  : psymtablestackitem;
         stackitem  : psymtablestackitem;

+ 4 - 0
compiler/symtype.pas

@@ -101,6 +101,8 @@ interface
          refs       : longint;
          refs       : longint;
          reflist    : TLinkedList;
          reflist    : TLinkedList;
          visibility : tvisibility;
          visibility : tvisibility;
+         { deprecated optionally can have a message }
+         deprecatedmsg: pshortstring;
          isdbgwritten : boolean;
          isdbgwritten : boolean;
          constructor create(st:tsymtyp;const aname:string);
          constructor create(st:tsymtyp;const aname:string);
          destructor  destroy;override;
          destructor  destroy;override;
@@ -334,10 +336,12 @@ implementation
          fileinfo:=current_tokenpos;
          fileinfo:=current_tokenpos;
          isdbgwritten := false;
          isdbgwritten := false;
          visibility:=vis_public;
          visibility:=vis_public;
+         deprecatedmsg:=nil;
       end;
       end;
 
 
     destructor  Tsym.destroy;
     destructor  Tsym.destroy;
       begin
       begin
+        stringdispose(deprecatedmsg);
         if assigned(RefList) then
         if assigned(RefList) then
           RefList.Free;
           RefList.Free;
         inherited Destroy;
         inherited Destroy;

+ 1 - 1
compiler/systems/i_linux.pas

@@ -717,7 +717,7 @@ unit i_linux;
                 varalignmin     : 0;
                 varalignmin     : 0;
                 varalignmax     : 4;
                 varalignmax     : 4;
                 localalignmin   : 4;
                 localalignmin   : 4;
-                localalignmax   : 8;
+                localalignmax   : 4;
                 recordalignmin  : 0;
                 recordalignmin  : 0;
                 recordalignmax  : 4;
                 recordalignmax  : 4;
                 maxCrecordalign : 4
                 maxCrecordalign : 4

+ 11 - 0
compiler/systems/t_embed.pas

@@ -245,6 +245,17 @@ begin
           Add('}');
           Add('}');
           Add('_stack_top = 0x20FFFC;');
           Add('_stack_top = 0x20FFFC;');
         end;
         end;
+      ct_stm32f103re:
+      with linkres do
+        begin
+          Add('ENTRY(_START)');
+          Add('MEMORY');
+          Add('{');
+          Add('    flash : ORIGIN = 0x08000000, LENGTH = 512K');
+          Add('    ram : ORIGIN = 0x20000000, LENGTH = 64K');
+          Add('}');
+          Add('_stack_top = 0x2000FFFC;');
+        end;
 
 
     else
     else
       internalerror(200902011);
       internalerror(200902011);

+ 9 - 1
compiler/tokens.pas

@@ -53,6 +53,7 @@ type
     _OP_SHR,
     _OP_SHR,
     _OP_XOR,
     _OP_XOR,
     _ASSIGNMENT,
     _ASSIGNMENT,
+    _OP_ENUMERATOR,
     { special chars }
     { special chars }
     _CARET,
     _CARET,
     _UNEQUAL,
     _UNEQUAL,
@@ -149,6 +150,7 @@ type
     _CONST,
     _CONST,
     _FALSE,
     _FALSE,
     _FAR16,
     _FAR16,
+    _FINAL,
     _INDEX,
     _INDEX,
     _LABEL,
     _LABEL,
     _LOCAL,
     _LOCAL,
@@ -170,6 +172,7 @@ type
     _REPEAT,
     _REPEAT,
     _RESULT,
     _RESULT,
     _RETURN,
     _RETURN,
+    _SEALED,
     _STATIC,
     _STATIC,
     _STORED,
     _STORED,
     _STRICT,
     _STRICT,
@@ -233,6 +236,7 @@ type
     _WRITEONLY,
     _WRITEONLY,
     _DEPRECATED,
     _DEPRECATED,
     _DESTRUCTOR,
     _DESTRUCTOR,
+    _ENUMERATOR,
     _IMPLEMENTS,
     _IMPLEMENTS,
     _INTERNPROC,
     _INTERNPROC,
     _OLDFPCCALL,
     _OLDFPCCALL,
@@ -262,7 +266,7 @@ const
   { last operator which can be overloaded, the first_overloaded should
   { last operator which can be overloaded, the first_overloaded should
     be declared directly after NOTOKEN }
     be declared directly after NOTOKEN }
   first_overloaded = succ(NOTOKEN);
   first_overloaded = succ(NOTOKEN);
-  last_overloaded  = _ASSIGNMENT;
+  last_overloaded  = _OP_ENUMERATOR;
 
 
 type
 type
   tokenrec=record
   tokenrec=record
@@ -309,6 +313,7 @@ const
       (str:'shr'           ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'shr'           ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'xor'           ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'xor'           ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:':='            ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:':='            ;special:true ;keyword:m_none;op:NOTOKEN),
+      (str:'enumerator'    ;special:true ;keyword:m_none;op:NOTOKEN),
     { Special chars }
     { Special chars }
       (str:'^'             ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'^'             ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'<>'            ;special:true ;keyword:m_none;op:NOTOKEN),
       (str:'<>'            ;special:true ;keyword:m_none;op:NOTOKEN),
@@ -405,6 +410,7 @@ const
       (str:'CONST'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'CONST'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'FALSE'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'FALSE'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'FAR16'         ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'FAR16'         ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'FINAL'         ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INDEX'         ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INDEX'         ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'LABEL'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'LABEL'         ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'LOCAL'         ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'LOCAL'         ;special:false;keyword:m_none;op:NOTOKEN),
@@ -426,6 +432,7 @@ const
       (str:'REPEAT'        ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'REPEAT'        ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'RESULT'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'RESULT'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'RETURN'        ;special:false;keyword:m_mac;op:NOTOKEN),
       (str:'RETURN'        ;special:false;keyword:m_mac;op:NOTOKEN),
+      (str:'SEALED'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STATIC'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STATIC'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STORED'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STORED'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STRICT'        ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'STRICT'        ;special:false;keyword:m_none;op:NOTOKEN),
@@ -489,6 +496,7 @@ const
       (str:'WRITEONLY'     ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'WRITEONLY'     ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'DEPRECATED'    ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'DEPRECATED'    ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'DESTRUCTOR'    ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'DESTRUCTOR'    ;special:false;keyword:m_all;op:NOTOKEN),
+      (str:'ENUMERATOR'    ;special:false;keyword:m_none;op:_OP_ENUMERATOR),
       (str:'IMPLEMENTS'    ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'IMPLEMENTS'    ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INTERNPROC'    ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'INTERNPROC'    ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'OLDFPCCALL'    ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'OLDFPCCALL'    ;special:false;keyword:m_none;op:NOTOKEN),

+ 37 - 19
compiler/utils/ppudump.pp

@@ -744,7 +744,7 @@ begin
 end;
 end;
 
 
 
 
-procedure readsymoptions;
+procedure readsymoptions(space : string);
 type
 type
   { symbol options }
   { symbol options }
   tsymoption=(sp_none,
   tsymoption=(sp_none,
@@ -757,7 +757,8 @@ type
     sp_has_overloaded,
     sp_has_overloaded,
     sp_internal,  { internal symbol, not reported as unused }
     sp_internal,  { internal symbol, not reported as unused }
     sp_implicitrename,
     sp_implicitrename,
-    sp_generic_para
+    sp_generic_para,
+    sp_has_deprecated_msg
   );
   );
   tsymoptions=set of tsymoption;
   tsymoptions=set of tsymoption;
   tsymopt=record
   tsymopt=record
@@ -765,18 +766,19 @@ type
     str  : string[30];
     str  : string[30];
   end;
   end;
 const
 const
-  symopts=10;
+  symopts=11;
   symopt : array[1..symopts] of tsymopt=(
   symopt : array[1..symopts] of tsymopt=(
-     (mask:sp_static;         str:'Static'),
-     (mask:sp_hint_deprecated;str:'Hint Deprecated'),
-     (mask:sp_hint_platform;  str:'Hint Platform'),
-     (mask:sp_hint_library;   str:'Hint Library'),
-     (mask:sp_hint_unimplemented;str:'Hint Unimplemented'),
-     (mask:sp_hint_experimental;str:'Hint Experimental'),
-     (mask:sp_has_overloaded; str:'Has overloaded'),
-     (mask:sp_internal;       str:'Internal'),
-     (mask:sp_implicitrename; str:'Implicit Rename'),
-     (mask:sp_generic_para;   str:'Generic Parameter')
+     (mask:sp_static;             str:'Static'),
+     (mask:sp_hint_deprecated;    str:'Hint Deprecated'),
+     (mask:sp_hint_platform;      str:'Hint Platform'),
+     (mask:sp_hint_library;       str:'Hint Library'),
+     (mask:sp_hint_unimplemented; str:'Hint Unimplemented'),
+     (mask:sp_hint_experimental;  str:'Hint Experimental'),
+     (mask:sp_has_overloaded;     str:'Has overloaded'),
+     (mask:sp_internal;           str:'Internal'),
+     (mask:sp_implicitrename;     str:'Implicit Rename'),
+     (mask:sp_generic_para;       str:'Generic Parameter'),
+     (mask:sp_has_deprecated_msg; str:'Has Deprecated Message')
   );
   );
 var
 var
   symoptions : tsymoptions;
   symoptions : tsymoptions;
@@ -798,6 +800,8 @@ begin
        end;
        end;
    end;
    end;
   writeln;
   writeln;
+  if sp_has_deprecated_msg in symoptions then
+    writeln(space,'Deprecated : ', ppufile.getstring);
 end;
 end;
 
 
 
 
@@ -809,7 +813,7 @@ begin
   readposinfo;
   readposinfo;
   writeln(space,'   Visibility : ',Visibility2Str(ppufile.getbyte));
   writeln(space,'   Visibility : ',Visibility2Str(ppufile.getbyte));
   write  (space,'   SymOptions : ');
   write  (space,'   SymOptions : ');
-  readsymoptions;
+  readsymoptions(space+'   ');
 end;
 end;
 
 
 
 
@@ -1074,6 +1078,7 @@ type
     po_classmethod,       { class method }
     po_classmethod,       { class method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_abstractmethod,    { Procedure is an abstract method }
     po_abstractmethod,    { Procedure is an abstract method }
+    po_finalmethod,       { Procedure is a final method }
     po_staticmethod,      { static method }
     po_staticmethod,      { static method }
     po_overridingmethod,  { method with override directive }
     po_overridingmethod,  { method with override directive }
     po_methodpointer,     { method pointer, only in procvardef, also used for 'with object do' }
     po_methodpointer,     { method pointer, only in procvardef, also used for 'with object do' }
@@ -1122,7 +1127,9 @@ type
     po_kylixlocal,
     po_kylixlocal,
     po_dispid,
     po_dispid,
     { weakly linked (i.e., may or may not exist at run time) }
     { weakly linked (i.e., may or may not exist at run time) }
-    po_weakexternal
+    po_weakexternal,
+    po_objc,
+    po_enumerator_movenext
   );
   );
   tprocoptions=set of tprocoption;
   tprocoptions=set of tprocoption;
 
 
@@ -1169,6 +1176,7 @@ const
      (mask:po_classmethod;     str:'ClassMethod'),
      (mask:po_classmethod;     str:'ClassMethod'),
      (mask:po_virtualmethod;   str:'VirtualMethod'),
      (mask:po_virtualmethod;   str:'VirtualMethod'),
      (mask:po_abstractmethod;  str:'AbstractMethod'),
      (mask:po_abstractmethod;  str:'AbstractMethod'),
+     (mask:po_finalmethod;     str:'FinalMethod'),
      (mask:po_staticmethod;    str:'StaticMethod'),
      (mask:po_staticmethod;    str:'StaticMethod'),
      (mask:po_overridingmethod;str:'OverridingMethod'),
      (mask:po_overridingmethod;str:'OverridingMethod'),
      (mask:po_methodpointer;   str:'MethodPointer'),
      (mask:po_methodpointer;   str:'MethodPointer'),
@@ -1205,7 +1213,9 @@ const
      (mask:po_has_importname;  str:'HasImportName'),
      (mask:po_has_importname;  str:'HasImportName'),
      (mask:po_kylixlocal;      str:'KylixLocal'),
      (mask:po_kylixlocal;      str:'KylixLocal'),
      (mask:po_dispid;          str:'DispId'),
      (mask:po_dispid;          str:'DispId'),
-     (mask:po_weakexternal;    str:'WeakExternal')
+     (mask:po_weakexternal;    str:'WeakExternal'),
+     (mask:po_objc;            str:'ObjC'),
+     (mask:po_enumerator_movenext; str:'EnumeratorMoveNext')
   );
   );
 var
 var
   proctypeoption  : tproctypeoption;
   proctypeoption  : tproctypeoption;
@@ -1354,6 +1364,8 @@ procedure readobjectdefoptions;
 type
 type
   tobjectoption=(oo_none,
   tobjectoption=(oo_none,
     oo_is_forward,         { the class is only a forward declared yet }
     oo_is_forward,         { the class is only a forward declared yet }
+    oo_is_abstract,        { the class is abstract - only descendants can be used }
+    oo_is_sealed,          { the class is sealed - can't have descendants }
     oo_has_virtual,        { the object/class has virtual methods }
     oo_has_virtual,        { the object/class has virtual methods }
     oo_has_private,
     oo_has_private,
     oo_has_protected,
     oo_has_protected,
@@ -1366,7 +1378,9 @@ type
     oo_has_msgint,
     oo_has_msgint,
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_has_default_property,
     oo_has_default_property,
-    oo_has_valid_guid
+    oo_has_valid_guid,
+    oo_has_enumerator_movenext,
+    oo_has_enumerator_current
   );
   );
   tobjectoptions=set of tobjectoption;
   tobjectoptions=set of tobjectoption;
   tsymopt=record
   tsymopt=record
@@ -1376,6 +1390,8 @@ type
 const
 const
   symopt : array[1..ord(high(tobjectoption))] of tsymopt=(
   symopt : array[1..ord(high(tobjectoption))] of tsymopt=(
      (mask:oo_is_forward;         str:'IsForward'),
      (mask:oo_is_forward;         str:'IsForward'),
+     (mask:oo_is_abstract;        str:'IsAbstract'),
+     (mask:oo_is_sealed;          str:'IsSealed'),
      (mask:oo_has_virtual;        str:'HasVirtual'),
      (mask:oo_has_virtual;        str:'HasVirtual'),
      (mask:oo_has_private;        str:'HasPrivate'),
      (mask:oo_has_private;        str:'HasPrivate'),
      (mask:oo_has_protected;      str:'HasProtected'),
      (mask:oo_has_protected;      str:'HasProtected'),
@@ -1388,7 +1404,9 @@ const
      (mask:oo_has_msgint;         str:'HasMsgInt'),
      (mask:oo_has_msgint;         str:'HasMsgInt'),
      (mask:oo_can_have_published; str:'CanHavePublished'),
      (mask:oo_can_have_published; str:'CanHavePublished'),
      (mask:oo_has_default_property;str:'HasDefaultProperty'),
      (mask:oo_has_default_property;str:'HasDefaultProperty'),
-     (mask:oo_has_valid_guid;     str:'HasValidGUID')
+     (mask:oo_has_valid_guid;     str:'HasValidGUID'),
+     (mask:oo_has_enumerator_movenext; str:'HasEnumeratorMoveNext'),
+     (mask:oo_has_enumerator_current;  str:'HasEnumeratorCurrent')
   );
   );
 var
 var
   symoptions : tobjectoptions;
   symoptions : tobjectoptions;
@@ -1860,7 +1878,7 @@ begin
              readposinfo;
              readposinfo;
              writeln(space,'       Visibility : ',Visibility2Str(ppufile.getbyte));
              writeln(space,'       Visibility : ',Visibility2Str(ppufile.getbyte));
              write  (space,'       SymOptions : ');
              write  (space,'       SymOptions : ');
-             readsymoptions;
+             readsymoptions(space+'       ');
              if tsystemcpu(ppufile.header.cpu)=cpu_powerpc then
              if tsystemcpu(ppufile.header.cpu)=cpu_powerpc then
                begin
                begin
                  { library symbol for AmigaOS/MorphOS }
                  { library symbol for AmigaOS/MorphOS }

+ 7 - 2
compiler/x86/cgx86.pas

@@ -351,6 +351,11 @@ unit cgx86;
         add_hreg: boolean;
         add_hreg: boolean;
 {$endif not  x86_64}
 {$endif not  x86_64}
       begin
       begin
+        { make_simple_ref() may have already been called earlier, and in that
+          case make sure we don't perform the PIC-simplifications twice }
+        if (ref.refaddr in [addr_pic,addr_pic_no_got]) then
+          exit;
+
 {$ifdef x86_64}
 {$ifdef x86_64}
         { Only 32bit is allowed }
         { Only 32bit is allowed }
         if ((ref.offset<low(longint)) or (ref.offset>high(longint))) then
         if ((ref.offset<low(longint)) or (ref.offset>high(longint))) then
@@ -397,7 +402,7 @@ unit cgx86;
                     if (ref.base<>NR_NO) or
                     if (ref.base<>NR_NO) or
                        (ref.index<>NR_NO) then
                        (ref.index<>NR_NO) then
                       begin
                       begin
-                        reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+                        reference_reset_symbol(href,ref.symbol,0,ref.alignment);
                         hreg:=getaddressregister(list);
                         hreg:=getaddressregister(list);
                         href.refaddr:=addr_pic_no_got;
                         href.refaddr:=addr_pic_no_got;
                         href.base:=NR_RIP;
                         href.base:=NR_RIP;
@@ -413,7 +418,7 @@ unit cgx86;
                   end
                   end
                 else
                 else
                   begin
                   begin
-                    reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+                    reference_reset_symbol(href,ref.symbol,0,ref.alignment);
                     hreg:=getaddressregister(list);
                     hreg:=getaddressregister(list);
                     href.refaddr:=addr_pic;
                     href.refaddr:=addr_pic;
                     href.base:=NR_RIP;
                     href.base:=NR_RIP;

+ 7 - 3
compiler/x86_64/cgcpu.pas

@@ -43,6 +43,7 @@ unit cgcpu;
         procedure a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);override;
         procedure a_param_ref(list : TAsmList;size : tcgsize;const r : treference;const paraloc : TCGPara);override;
       end;
       end;
 
 
+    procedure create_codegen;
 
 
   implementation
   implementation
 
 
@@ -245,7 +246,10 @@ unit cgcpu;
         List.concat(Tai_symbol_end.Createname(labelname));
         List.concat(Tai_symbol_end.Createname(labelname));
       end;
       end;
 
 
-
-begin
-  cg:=tcgx86_64.create;
+      
+    procedure create_codegen;
+      begin
+        cg:=tcgx86_64.create;
+      end;
+      
 end.
 end.

+ 1 - 1
ide/Makefile.fpc

@@ -68,7 +68,7 @@ SYSLIBDIR=/lib /usr/lib /usr/local/lib
 # Detect if libgdb.a is available
 # Detect if libgdb.a is available
 override LIBGDBFILE=$(firstword $(wildcard $(addsuffix /libgdb.a,$(SYSLIBDIR))))
 override LIBGDBFILE=$(firstword $(wildcard $(addsuffix /libgdb.a,$(SYSLIBDIR))))
 ifneq (${LIBGDBFILE},)
 ifneq (${LIBGDBFILE},)
-$(warning Using system sefault libgdb file located in ${LIBGDBFILE})
+$(warning Using system default libgdb file located in ${LIBGDBFILE})
 GDBLIBDIR=$(dir ${LIBGDBFILE})
 GDBLIBDIR=$(dir ${LIBGDBFILE})
 endif
 endif
 endif
 endif

+ 103 - 8
ide/fpdebug.pas

@@ -51,6 +51,7 @@ type
      HasExe   : boolean;
      HasExe   : boolean;
      RunCount : longint;
      RunCount : longint;
      WindowWidth : longint;
      WindowWidth : longint;
+     TBreakNumber : longint;
      FPCBreakErrorNumber : longint;
      FPCBreakErrorNumber : longint;
 {$ifdef SUPPORT_REMOTE}
 {$ifdef SUPPORT_REMOTE}
      isRemoteDebugging:boolean;
      isRemoteDebugging:boolean;
@@ -65,6 +66,9 @@ type
     procedure DoBreakSession;virtual;}
     procedure DoBreakSession;virtual;}
     procedure DoEndSession(code:longint);virtual;
     procedure DoEndSession(code:longint);virtual;
     procedure DoUserSignal;virtual;
     procedure DoUserSignal;virtual;
+    procedure FlushAll; virtual;
+    function Query(question : pchar; args : pchar) : longint; virtual;
+
     procedure AnnotateError;
     procedure AnnotateError;
     procedure InsertBreakpoints;
     procedure InsertBreakpoints;
     procedure RemoveBreakpoints;
     procedure RemoveBreakpoints;
@@ -334,8 +338,10 @@ uses
 {$ifdef DOS}
 {$ifdef DOS}
   fpusrscr,
   fpusrscr,
 {$endif DOS}
 {$endif DOS}
+
   App,Strings,
   App,Strings,
   FVConsts,
   FVConsts,
+  MsgBox,
 {$ifdef Windows}
 {$ifdef Windows}
   Windebug,
   Windebug,
 {$endif Windows}
 {$endif Windows}
@@ -603,7 +609,8 @@ procedure UpdateDebugViews;
 
 
   begin
   begin
 {$ifdef SUPPORT_REMOTE}
 {$ifdef SUPPORT_REMOTE}
-     PushStatus(msg_getting_info_on+RemoteMachine);
+     if isRemoteDebugging then
+       PushStatus(msg_getting_info_on+RemoteMachine);
 {$endif SUPPORT_REMOTE}
 {$endif SUPPORT_REMOTE}
      DeskTop^.Lock;
      DeskTop^.Lock;
      If assigned(StackWindow) then
      If assigned(StackWindow) then
@@ -620,7 +627,8 @@ procedure UpdateDebugViews;
        VectorWindow^.Update;
        VectorWindow^.Update;
      DeskTop^.UnLock;
      DeskTop^.UnLock;
 {$ifdef SUPPORT_REMOTE}
 {$ifdef SUPPORT_REMOTE}
-     PopStatus;
+     if isRemoteDebugging then
+       PopStatus;
 {$endif SUPPORT_REMOTE}
 {$endif SUPPORT_REMOTE}
   end;
   end;
 
 
@@ -648,6 +656,10 @@ begin
     begin
     begin
       LoadFile(f);
       LoadFile(f);
       HasExe:=true;
       HasExe:=true;
+      { Procedure HandleErrorAddrFrame
+         (Errno : longint;addr,frame : longint);
+         [public,alias:'FPC_BREAK_ERROR'];
+      Command('b HANDLEERRORADDRFRAME'); }
       Command('b FPC_BREAK_ERROR');
       Command('b FPC_BREAK_ERROR');
       FPCBreakErrorNumber:=last_breakpoint_number;
       FPCBreakErrorNumber:=last_breakpoint_number;
 {$ifdef FrameNameKnown}
 {$ifdef FrameNameKnown}
@@ -826,6 +838,8 @@ begin
            PopStatus;
            PopStatus;
            exit;
            exit;
         end;
         end;
+      s:=IDEApp.GetRemoteExecString;
+      MessageBox(#3'Start in remote'#13#3+s,nil,mfOKbutton);
       PopStatus;
       PopStatus;
     end
     end
   else
   else
@@ -941,6 +955,76 @@ begin
     GDBWindow^.WriteString(S);
     GDBWindow^.WriteString(S);
 end;
 end;
 
 
+function TDebugController.Query(question : pchar; args : pchar) : longint;
+var
+  c : char;
+  WasModal : boolean;
+  ModalView : PView;
+  res : longint;
+begin
+  if not assigned(Application) then
+    begin
+      system.Write(question);
+      repeat
+        system.write('(y or n)');
+        system.read(c);
+        system.writeln(c);
+      until (lowercase(c)='y') or (lowercase(c)='n');
+      if lowercase(c)='y' then
+        query:=1
+      else
+        query:=0;
+      exit;
+    end;
+  if assigned(Application^.Current) and
+     ((Application^.Current^.State and sfModal)<>0) then
+    begin
+      WasModal:=true;
+      ModalView:=Application^.Current;
+      ModalView^.SetState(sfModal, false);
+      ModalView^.Hide;
+    end
+  else
+    WasModal:=false;
+  PushStatus(Question);
+  res:=MessageBox(Question,nil,mfyesbutton+mfnobutton);
+  PopStatus;
+  if res=cmYes then
+    Query:=1
+  else
+    Query:=0;
+  if WasModal then
+    begin
+      ModalView^.Show;
+      ModalView^.SetState(sfModal, true);
+      ModalView^.Draw;
+    end;
+end;
+
+procedure TDebugController.FlushAll;
+begin
+  if assigned(GDBWindow) then
+    begin
+      If StrLen(GetError)>0 then
+        begin
+          GDBWindow^.WriteErrorText(GetError);
+          if in_command=0 then
+            gdberrorbuf.reset;
+        end;
+
+      If StrLen(GetOutput)>0 then
+        begin
+          GDBWindow^.WriteOutputText(GetOutput);
+          { Keep output for command results }
+          if in_command=0 then
+            gdboutputbuf.reset;
+        end;
+    end
+  else
+    Inherited FlushAll;
+end;
+
+
 procedure TDebugController.CommandEnd(const s:string);
 procedure TDebugController.CommandEnd(const s:string);
 begin
 begin
   if assigned(GDBWindow) and (in_command<=1) then
   if assigned(GDBWindow) and (in_command<=1) then
@@ -1269,7 +1353,13 @@ begin
        end
        end
       else if not assigned(PB) then
       else if not assigned(PB) then
         begin
         begin
-          WarningBox(#3'Stopped by breakpoint '+IntToStr(BreakIndex),nil);
+          if (BreakIndex<>start_break_number) and
+             (BreakIndex<>TbreakNumber) then
+            WarningBox(#3'Stopped by breakpoint '+IntToStr(BreakIndex),nil);
+          if BreakIndex=start_break_number then
+            start_break_number:=0;
+          if BreakIndex=TbreakNumber then
+            TbreakNumber:=0;
         end
         end
       { For watch we should get old and new value !! }
       { For watch we should get old and new value !! }
       else if (Not assigned(GDBWindow) or not GDBWindow^.GetState(sfActive)) and
       else if (Not assigned(GDBWindow) or not GDBWindow^.GetState(sfActive)) and
@@ -1377,14 +1467,15 @@ begin
   if NoSwitch then
   if NoSwitch then
     begin
     begin
 {$ifdef SUPPORT_REMOTE}
 {$ifdef SUPPORT_REMOTE}
-      PushStatus(msg_runningremotely+RemoteMachine);
-{$else not SUPPORT_REMOTE}
+      if isRemoteDebugging then
+        PushStatus(msg_runningremotely+RemoteMachine)
+      else
+{$endif SUPPORT_REMOTE}
 {$ifdef Unix}
 {$ifdef Unix}
       PushStatus(msg_runninginanotherwindow+DebuggeeTTY);
       PushStatus(msg_runninginanotherwindow+DebuggeeTTY);
 {$else not Unix}
 {$else not Unix}
       PushStatus(msg_runninginanotherwindow);
       PushStatus(msg_runninginanotherwindow);
 {$endif Unix}
 {$endif Unix}
-{$endif not SUPPORT_REMOTE}
     end
     end
   else
   else
     begin
     begin
@@ -3508,15 +3599,17 @@ end;
 
 
 function GetGDBTargetShortName : string;
 function GetGDBTargetShortName : string;
 begin
 begin
+{$ifndef CROSSGDB}
+GetGDBTargetShortName:=source_info.shortname;
+{$else CROSSGDB}
 {$ifdef SUPPORT_REMOTE}
 {$ifdef SUPPORT_REMOTE}
 {$ifdef PALMOSGDB}
 {$ifdef PALMOSGDB}
 GetGDBTargetShortName:='palmos';
 GetGDBTargetShortName:='palmos';
 {$else}
 {$else}
 GetGDBTargetShortName:='linux';
 GetGDBTargetShortName:='linux';
 {$endif PALMOSGDB}
 {$endif PALMOSGDB}
-{$else not SUPPORT_REMOTE}
-GetGDBTargetShortName:=source_info.shortname
 {$endif not SUPPORT_REMOTE}
 {$endif not SUPPORT_REMOTE}
+{$endif CROSSGDB}
 end;
 end;
 
 
 procedure InitDebugger;
 procedure InitDebugger;
@@ -3556,6 +3649,7 @@ begin
 {$endif}
 {$endif}
 
 
   NeedRecompileExe:=false;
   NeedRecompileExe:=false;
+{$ifndef SUPPORT_REMOTE}
   if UpCaseStr(TargetSwitches^.GetCurrSelParam)<>UpCaseStr(GetGDBTargetShortName) then
   if UpCaseStr(TargetSwitches^.GetCurrSelParam)<>UpCaseStr(GetGDBTargetShortName) then
     begin
     begin
      ClearFormatParams;
      ClearFormatParams;
@@ -3575,6 +3669,7 @@ begin
          IDEApp.UpdateTarget;
          IDEApp.UpdateTarget;
        end;
        end;
     end;
     end;
+{$endif ndef SUPPORT_REMOTE}
   if not NeedRecompileExe then
   if not NeedRecompileExe then
     NeedRecompileExe:=(not ExistsFile(ExeFile)) or (CompilationPhase<>cpDone) or
     NeedRecompileExe:=(not ExistsFile(ExeFile)) or (CompilationPhase<>cpDone) or
      (PrevMainFile<>MainFile) or NeedRecompile(cRun,false);
      (PrevMainFile<>MainFile) or NeedRecompile(cRun,false);

+ 11 - 0
ide/fpide.pas

@@ -565,6 +565,17 @@ resourcestring  menu_local_gotosource = '~G~oto source';
                 label_debugger_redirection = 'Debuggee ~R~edirection';
                 label_debugger_redirection = 'Debuggee ~R~edirection';
                 label_debugger_useanothertty = '~U~se Another tty for Debuggee';
                 label_debugger_useanothertty = '~U~se Another tty for Debuggee';
 
 
+                { Remote options dialog }
+                dialog_remote = 'Remote setup';
+                label_remote_machine = 'Remote machine ~n~ame';
+                label_remote_port = 'Remote ~p~ort number';
+                label_remote_dir = 'Remote ~d~irectory';
+                label_remote_config = 'Remote config ~o~ptions';
+                label_remote_ident = 'Remote ~i~dent';
+                label_remote_command = 'Remote ~c~ommand';
+                label_remote_scp = 'Scp executable';
+                label_remote_ssh = 'Ssh executable';
+
                 {Directories dialog.}
                 {Directories dialog.}
                 dialog_directories = 'Directories';
                 dialog_directories = 'Directories';
 
 

+ 2 - 2
ide/test.pas

@@ -45,13 +45,13 @@ type
       end;
       end;
 
 
       TClass = class
       TClass = class
-        constructor Create;
         name : string;
         name : string;
+        constructor Create;
       end;
       end;
 
 
       TClass2 = class(TClass)
       TClass2 = class(TClass)
-        constructor Create;
         X : longint;
         X : longint;
+        constructor Create;
       end;
       end;
 
 
       EnumTyp = (enum1,enum2,enum3);
       EnumTyp = (enum1,enum2,enum3);

+ 11 - 2
ide/wchmhwrap.pas

@@ -129,7 +129,9 @@ begin
      debugmessageS({$i %file%},'TCHMWrapper: indexfilename:'+fchmr.indexfile,{$i %line%},'1',0,0);
      debugmessageS({$i %file%},'TCHMWrapper: indexfilename:'+fchmr.indexfile,{$i %line%},'1',0,0);
  {$endif}
  {$endif}
 
 
-  m:=fchmr.getobject(fchmr.indexfile);
+
+  findex:=fchmr.GetIndexSitemap(false);
+(*  m:=fchmr.getobject(fchmr.indexfile);
   try
   try
    if assigned(m) then
    if assigned(m) then
      begin
      begin
@@ -141,6 +143,7 @@ begin
   finally
   finally
     freeandnil(m);
     freeandnil(m);
     end;
     end;
+    *)
    {$ifdef wdebug}
    {$ifdef wdebug}
      debugmessageS({$i %file%},'TCHMWrapper: loadindex after final ',{$i %line%},'1',0,0);
      debugmessageS({$i %file%},'TCHMWrapper: loadindex after final ',{$i %line%},'1',0,0);
   {$endif}
   {$endif}
@@ -148,6 +151,12 @@ begin
   tli:=TopicLinks^.AddItem(fchmr.defaultpage);
   tli:=TopicLinks^.AddItem(fchmr.defaultpage);
   TLI:=EncodeHTMLCtx(ID,TLI+1);
   TLI:=EncodeHTMLCtx(ID,TLI+1);
   IndexEntries^.Insert(NewIndexEntry(  FormatAlias('Table of contents'),ID,TLI));
   IndexEntries^.Insert(NewIndexEntry(  FormatAlias('Table of contents'),ID,TLI));
+  if findex= Nil Then
+    begin
+      floaded:=true;
+      exit(true);
+    end;
+  if assigned(findex.items) and (findex.items.count>0) Then
   for i:=0 to findex.items.count-1 do
   for i:=0 to findex.items.count-1 do
     begin
     begin
       item:=findex.items.item[i];
       item:=findex.items.item[i];
@@ -289,7 +298,7 @@ begin
                Afileid:=chmw.fileid;
                Afileid:=chmw.fileid;
                alinkid:=chmw.fTopicLinks.additem(restlink);
                alinkid:=chmw.fTopicLinks.additem(restlink);
                result:=true;
                result:=true;
-            end;    
+            end;
          end;
          end;
     end
     end
 end;
 end;

+ 3 - 1
installer/install.dat

@@ -447,7 +447,7 @@ package=compiler.source.zip[compsrc.zip],~C~ompiler sources
 # Source 3
 # Source 3
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 # Source 4
 # Source 4
-package=units-graph.source.zip[ugrphsrc.zip],Unit Graph
+package=ide.source.zip[idesrc.zip],IDE sources
 # Source 5
 # Source 5
 package=utils.source.zip[utilsrc.zip],~U~tils sources
 package=utils.source.zip[utilsrc.zip],~U~tils sources
 # Source 6
 # Source 6
@@ -470,6 +470,8 @@ package=units-zlib.source.zip[uzlibsrc.zip],ZLib interface units
 package=units-gdbint.source.zip[ugdbsrc.zip],GDB interface units
 package=units-gdbint.source.zip[ugdbsrc.zip],GDB interface units
 # Source 15
 # Source 15
 package=units-postgres.source.zip[upgrsrc.zip],PostGreSQL interface units
 package=units-postgres.source.zip[upgrsrc.zip],PostGreSQL interface units
+# Source 16
+package=units-graph.source.zip[ugrphsrc.zip],Unit Graph
 
 
 #
 #
 # Source packages 2nd part
 # Source packages 2nd part

+ 1 - 1
installer/install.pas

@@ -98,7 +98,7 @@ program install;
 
 
 
 
      maxpacks=30;
      maxpacks=30;
-     maxpackages=28;
+     maxpackages=29;
      maxdefcfgs=1024;
      maxdefcfgs=1024;
 
 
      HTMLIndexExt = '.htx';
      HTMLIndexExt = '.htx';

File diff suppressed because it is too large
+ 256 - 69
packages/Makefile


+ 46 - 25
packages/Makefile.fpc

@@ -4,8 +4,8 @@
 #
 #
 
 
 [target]
 [target]
-dirs=hash pasjpeg paszlib fpmkunit fcl-xml fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-fpcunit fcl-json  fcl-process unzip regexpr chm fcl-res libgd symbolic 
-dirs_linux_i386=libc unixutil graph pxlib
+dirs=hash pasjpeg paszlib fpmkunit fcl-xml fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-fpcunit fcl-json  fcl-process unzip regexpr chm fcl-res libgd symbolic bzip2
+dirs_linux_i386=libc unixutil graph pxlib bzip2
 dirs_i386_linux=graph
 dirs_i386_linux=graph
 dirs_x86_64_linux=graph
 dirs_x86_64_linux=graph
 dirs_powerpc_linux=graph
 dirs_powerpc_linux=graph
@@ -24,16 +24,16 @@ dirs_haiku=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc pos
 dirs_freebsd=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_freebsd=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
                gdbint libpng x11 gdbm tcl syslog libcurl opengl cairo  bfd aspell svgalib \
                gdbint libpng x11 gdbm tcl syslog libcurl opengl cairo  bfd aspell svgalib \
                imlib utmp  fpgtk xforms fftw pcap ggi sdl openssl graph gnome1 gtk1 gtk2 librsvg httpd13 httpd20 httpd22 pxlib numlib \
                imlib utmp  fpgtk xforms fftw pcap ggi sdl openssl graph gnome1 gtk1 gtk2 librsvg httpd13 httpd20 httpd22 pxlib numlib \
-               users iconvenc gmp
+               users iconvenc gmp fcl-extra libxml
 dirs_darwin=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_darwin=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-                libpng gdbm tcl syslog libcurl bfd aspell utmp fftw pcap openssl numlib iconvenc gmp
+                libpng gdbm tcl syslog libcurl bfd aspell utmp fftw pcap openssl numlib iconvenc gmp fcl-extra
 dirs_i386_darwin=graph univint cocoaint sdl opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms  gnome1 httpd13 httpd20 httpd22 imlib opengles objcrtl
 dirs_i386_darwin=graph univint cocoaint sdl opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms  gnome1 httpd13 httpd20 httpd22 imlib opengles objcrtl
 dirs_powerpc_darwin=graph univint cocoaint sdl opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib objcrtl
 dirs_powerpc_darwin=graph univint cocoaint sdl opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib objcrtl
 dirs_x86_64_darwin=opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib
 dirs_x86_64_darwin=opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib
 dirs_powerpc64_darwin=opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib
 dirs_powerpc64_darwin=opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib
 dirs_arm_darwin= httpd13 httpd20 httpd22 opengles objcrtl
 dirs_arm_darwin= httpd13 httpd20 httpd22 opengles objcrtl
 dirs_solaris=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_solaris=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-               libpng x11 gdbm tcl syslog libcurl opengl cairo gtk1 bfd svgalib \
+               libpng x11 gdbm tcl syslog libcurl opengl cairo gtk1 bfd svgalib fcl-extra \
                imlib utmp  fpgtk xforms fftw pcap ggi  openssl gnome1 httpd13 httpd20 httpd22 numlib
                imlib utmp  fpgtk xforms fftw pcap ggi  openssl gnome1 httpd13 httpd20 httpd22 numlib
 dirs_netbsd=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_netbsd=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
                gdbint libpng x11 gdbm tcl syslog libcurl opengl cairo gtk1 gtk2 librsvg bfd aspell svgalib \
                gdbint libpng x11 gdbm tcl syslog libcurl opengl cairo gtk1 gtk2 librsvg bfd aspell svgalib \
@@ -43,13 +43,13 @@ dirs_openbsd=fv fcl-web fastcgi fcl-async ibase mysql ncurses zlib oracle odbc
                imlib utmp  fpgtk xforms fftw pcap ggi sdl openssl gnome1 httpd13 httpd20 httpd22 pxlib numlib
                imlib utmp  fpgtk xforms fftw pcap ggi sdl openssl gnome1 httpd13 httpd20 httpd22 pxlib numlib
 dirs_linux=fv fcl-web fastcgi fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick \
 dirs_linux=fv fcl-web fastcgi fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick \
                gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl cairo gtk1 gtk2 librsvg \
                gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl cairo gtk1 gtk2 librsvg \
-               a52 bfd aspell svgalib newt cdrom users  iconvenc libxml proj4 \
+               a52 bfd aspell svgalib newt cdrom users  iconvenc libxml proj4 fcl-extra \
                imlib utmp  fpgtk openal lua oggvorbis xforms fftw pcap ggi sdl openssl gnome1 httpd13 httpd20 httpd22 pxlib numlib gmp
                imlib utmp  fpgtk openal lua oggvorbis xforms fftw pcap ggi sdl openssl gnome1 httpd13 httpd20 httpd22 pxlib numlib gmp
 dirs_win32=fv winunits-base winunits-jedi fcl-web fastcgi ibase mysql zlib oracle odbc postgres sqlite imagemagick \
 dirs_win32=fv winunits-base winunits-jedi fcl-web fastcgi ibase mysql zlib oracle odbc postgres sqlite imagemagick \
-               gdbint libpng mad tcl opengl gtk1 gtk2 librsvg a52 cdrom fpgtk openal fftw lua \
+               gdbint libpng mad tcl opengl gtk1 gtk2 librsvg a52 cdrom fpgtk openal fftw lua fcl-extra \
                oggvorbis sdl openssl graph pcap httpd13 httpd20 httpd22 pxlib numlib winceunits cairo libxml gmp
                oggvorbis sdl openssl graph pcap httpd13 httpd20 httpd22 pxlib numlib winceunits cairo libxml gmp
 dirs_win64=fv winunits-base winunits-jedi fcl-web fastcgi ibase mysql zlib oracle odbc postgres sqlite imagemagick \
 dirs_win64=fv winunits-base winunits-jedi fcl-web fastcgi ibase mysql zlib oracle odbc postgres sqlite imagemagick \
-                tcl opengl gtk1 fpgtk fftw sdl openssl cdrom httpd13 httpd20 httpd22 numlib
+                tcl opengl gtk1 fpgtk fftw sdl openssl cdrom httpd13 httpd20 httpd22 numlib fcl-extra
 dirs_wince=winceunits httpd22 fcl-web fastcgi tcl fftw unzip zlib sqlite mysql ibase postgres oracle odbc sdl openssl oggvorbis numlib
 dirs_wince=winceunits httpd22 fcl-web fastcgi tcl fftw unzip zlib sqlite mysql ibase postgres oracle odbc sdl openssl oggvorbis numlib
 dirs_os2=fv zlib libpng x11 tcl fpgtk rexx os2units gtk1 imlib
 dirs_os2=fv zlib libpng x11 tcl fpgtk rexx os2units gtk1 imlib
 dirs_emx=fv zlib libpng x11 tcl fpgtk rexx os2units gtk1 imlib
 dirs_emx=fv zlib libpng x11 tcl fpgtk rexx os2units gtk1 imlib
@@ -74,13 +74,13 @@ fpmkunit_smart: fcl-base_smart fcl-process_smart paszlib_smart
 fpmkunit_release: fcl-base_release fcl-process_release paszlib_release
 fpmkunit_release: fcl-base_release fcl-process_release paszlib_release
 fpmkunit_shared: fcl-base_shared fcl-process_shared paszlib_shared
 fpmkunit_shared: fcl-base_shared fcl-process_shared paszlib_shared
 
 
-
-ifneq ($(findstring $(OS_TARGET),win32 win64),)
-fcl-base_all: paszlib_all winunits-base_all winunits-jedi_all
-fcl-base_debug: paszlib_debug winunits-base_debug winunits-jedi_debug
-fcl-base_smart: paszlib_smart winunits-base_smart winunits-jedi_smart
-fcl-base_release: paszlib_release winunits-base_release winunits-jedi_release
-fcl-base_shared: paszlib_shared winunits-base_shared winunits-jedi_shared
+ifneq ($(findstring $(FULL_TARGET),powerpc-darwin i386-darwin),)
+fcl-base_all: univint_all paszlib_all
+fcl-base_debug: univint_debug paszlib_debug
+fcl-base_smart: univint_smart paszlib_smart
+fcl-base_release: univint_release paszlib_release
+fcl-base_shared: univint_shared paszlib_shared
+else
 fcl-base_all: paszlib_all
 fcl-base_all: paszlib_all
 fcl-base_debug: paszlib_debug
 fcl-base_debug: paszlib_debug
 fcl-base_smart: paszlib_smart
 fcl-base_smart: paszlib_smart
@@ -88,18 +88,32 @@ fcl-base_release: paszlib_release
 fcl-base_shared: paszlib_shared
 fcl-base_shared: paszlib_shared
 endif
 endif
 
 
+ifneq ($(findstring $(OS_TARGET),win32 win64),)
+fcl-extra_all: fcl-base winunits-base_all winunits-jedi_all
+fcl-extra_debug: fcl-base_debug winunits-base_debug winunits-jedi_debug
+fcl-extra_smart: fcl-base_smart winunits-base_smart winunits-jedi_smart
+fcl-extra_release: fcl-base_release winunits-base_release winunits-jedi_release
+fcl-extra_shared: fcl-base_shared winunits-base_shared winunits-jedi_shared
+else
 ifneq ($(findstring $(FULL_TARGET),powerpc-darwin i386-darwin),)
 ifneq ($(findstring $(FULL_TARGET),powerpc-darwin i386-darwin),)
-fcl-base_all: univint_all
-fcl-base_debug: univint_debug
-fcl-base_smart: univint_smart
-fcl-base_release: univint_release
-fcl-base_shared: univint_shared
+fcl-extra_all: univint_all fcl-base_all
+fcl-extra_debug: univint_debug fcl-base_debug
+fcl-extra_smart: univint_smart fcl-base_release
+fcl-extra_release: univint_release fcl-base_release
+fcl-extra_shared: univint_shared fcl-base_shared
 
 
 cocoaint_all: univint_all
 cocoaint_all: univint_all
 cocoaint_debug: univint_debug
 cocoaint_debug: univint_debug
 cocoaint_smart: univint_smart
 cocoaint_smart: univint_smart
 cocoaint_release: univint_release
 cocoaint_release: univint_release
 cocoaint_shared: univint_shared
 cocoaint_shared: univint_shared
+else
+fcl-extra_all: fcl-base_all
+fcl-extra_debug: fcl-base_debug
+fcl-extra_smart: fcl-base_smart
+fcl-extra_release: fcl-base_release
+fcl-extra_shared: fcl-base_shared
+endif
 endif
 endif
 
 
 fcl-xml_all: fcl-base_all
 fcl-xml_all: fcl-base_all
@@ -304,11 +318,18 @@ unixutil_smart: libc_smart fcl-base_smart
 unixutil_debug: libc_debug fcl-base_debug
 unixutil_debug: libc_debug fcl-base_debug
 unixutil_release: libc_release fcl-base_release
 unixutil_release: libc_release fcl-base_release
 
 
-winunits-jedi_all: winunits-base_all
-winunits-jedi_shared: winunits-base_shared
-winunits-jedi_smart: winunits-base_smart
-winunits-jedi_debug: winunits-base_debug
-winunits-jedi_release: winunits-base_release
+winunits-base_all: fcl-registry fcl-base_all
+winunits-base_shared: fcl-registry fcl-base_shared
+winunits-base_smart: fcl-registry fcl-base_smart
+winunits-base_debug: fcl-registry fcl-base_debug
+winunits-base_release: fcl-registry fcl-base_release
+
+winunits-jedi_all: winunits-base_all fcl-registry fcl-base_all
+winunits-jedi_shared: winunits-base_shared fcl-registry fcl-base_shared
+winunits-jedi_smart: winunits-base_smart fcl-registry fcl-base_smart
+winunits-jedi_debug: winunits-base_debug fcl-registry fcl-base_debug
+winunits-jedi_release: winunits-base_release fcl-registry fcl-base_release
+
 
 
 xforms_all: x11_all
 xforms_all: x11_all
 xforms_shared: x11_shared
 xforms_shared: x11_shared

+ 59 - 59
packages/chm/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/08/02]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/10/03]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
@@ -441,178 +441,178 @@ ifeq ($(FULL_TARGET),armeb-embedded)
 override TARGET_PROGRAMS+=chmcmd chmls
 override TARGET_PROGRAMS+=chmcmd chmls
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer chmfiftimain lzxcompressthread
 endif
 endif
 override INSTALL_FPCPACKAGE=y
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)

+ 1 - 1
packages/chm/Makefile.fpc

@@ -9,7 +9,7 @@ version=2.5.1
 [target]
 [target]
 units=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes \
 units=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes \
       chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer \
       chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader htmlindexer \
-      chmfiftimain
+      chmfiftimain lzxcompressthread
 programs=chmcmd chmls
 programs=chmcmd chmls
 examples=
 examples=
 
 

+ 6 - 1
packages/chm/fpmake.pp

@@ -56,7 +56,7 @@ begin
         end;
         end;
     T:=P.Targets.AddUnit('chmtypes.pas');
     T:=P.Targets.AddUnit('chmtypes.pas');
       with T.Dependencies do
       with T.Dependencies do
-        begin
+       begin
           AddUnit('chmbase');
           AddUnit('chmbase');
         end;
         end;
     T:=P.Targets.AddUnit('htmlindexer.pas');
     T:=P.Targets.AddUnit('htmlindexer.pas');
@@ -74,6 +74,11 @@ begin
           AddUnit('paslzxcomp');
           AddUnit('paslzxcomp');
           AddUnit('chmfiftimain');
           AddUnit('chmfiftimain');
         end;
         end;
+    T:=P.Targets.AddUnit('lzxcompressthread');
+      with T.Dependencies do
+        begin
+          AddUnit('paslzxcomp');
+        end;
     T:=P.Targets.AddUnit('fasthtmlparser.pas');
     T:=P.Targets.AddUnit('fasthtmlparser.pas');
     T:=P.Targets.AddUnit('htmlutil.pas');
     T:=P.Targets.AddUnit('htmlutil.pas');
     T:=P.Targets.AddUnit('paslznonslide.pas');
     T:=P.Targets.AddUnit('paslznonslide.pas');

+ 21 - 4
packages/chm/src/chmfiftimain.pas

@@ -67,6 +67,7 @@ type
     FWriteStream: TStream;
     FWriteStream: TStream;
     FBlockStream: TMemoryStream;
     FBlockStream: TMemoryStream;
     ParentNode: TFIftiNode;
     ParentNode: TFIftiNode;
+    OwnsParentNode : boolean;
     function  AdjustedWord(AWord: String; out AOffset: Byte; AOldWord: String): String;
     function  AdjustedWord(AWord: String; out AOffset: Byte; AOldWord: String): String;
     procedure ChildIsFull(AWord: String; ANodeOffset: DWord); virtual; abstract;
     procedure ChildIsFull(AWord: String; ANodeOffset: DWord); virtual; abstract;
     function  GuessIfCanHold(AWord: String): Boolean; virtual; abstract;
     function  GuessIfCanHold(AWord: String): Boolean; virtual; abstract;
@@ -91,6 +92,7 @@ type
   public
   public
     procedure WriteToStream;
     procedure WriteToStream;
     constructor Create(AStream: TStream; AWordList: TIndexedWordList);
     constructor Create(AStream: TStream; AWordList: TIndexedWordList);
+    destructor Destroy; override;
   end;
   end;
 
 
   { TChmSearchReader }
   { TChmSearchReader }
@@ -259,6 +261,7 @@ begin
     FActiveLeafNode.Flush(False); // causes the unwritten parts of the tree to be written
     FActiveLeafNode.Flush(False); // causes the unwritten parts of the tree to be written
 end;
 end;
 
 
+
 procedure TChmSearchWriter.WriteHeader ( IsPlaceHolder: Boolean ) ;
 procedure TChmSearchWriter.WriteHeader ( IsPlaceHolder: Boolean ) ;
 var
 var
   TmpNode: TFIftiNode;
   TmpNode: TFIftiNode;
@@ -344,6 +347,7 @@ begin
 end;
 end;
 
 
 procedure TChmSearchWriter.WriteAWord ( AWord: TIndexedWord ) ;
 procedure TChmSearchWriter.WriteAWord ( AWord: TIndexedWord ) ;
+
 begin
 begin
   if FActiveLeafNode = nil then
   if FActiveLeafNode = nil then
   begin
   begin
@@ -363,7 +367,6 @@ begin
   TLeafNode(FActiveLeafNode).AddWord(AWord);
   TLeafNode(FActiveLeafNode).AddWord(AWord);
 end;
 end;
 
 
-
 procedure TChmSearchWriter.WriteToStream;
 procedure TChmSearchWriter.WriteToStream;
 begin
 begin
   WriteHeader(True);
   WriteHeader(True);
@@ -376,9 +379,16 @@ constructor TChmSearchWriter.Create ( AStream: TStream;
 begin
 begin
   FStream := AStream;
   FStream := AStream;
   FWordList := AWordList;
   FWordList := AWordList;
+  FActiveLeafNode:=NIL; 
+end;
+
+destructor TChmSearchWriter.Destroy;
 
 
+begin
+ freeandnil(FActiveLeafNode);
 end;
 end;
 
 
+
 { TLeafNode }
 { TLeafNode }
 
 
 function TFIftiNode.RemainingSpace: DWord;
 function TFIftiNode.RemainingSpace: DWord;
@@ -391,11 +401,13 @@ begin
   inherited Create;
   inherited Create;
   FWriteStream := AStream;
   FWriteStream := AStream;
   FBlockStream := TMemoryStream.Create;
   FBlockStream := TMemoryStream.Create;
+  OwnsParentNode :=false;
 end;
 end;
 
 
 destructor TFIftiNode.Destroy;
 destructor TFIftiNode.Destroy;
 begin
 begin
   FBlockStream.Free;
   FBlockStream.Free;
+  if OwnsParentNode then ParentNode.Free;
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
@@ -486,8 +498,10 @@ begin
   if NewBlockNeeded or ((NewBlockNeeded = False) and (ParentNode <> nil)) then
   if NewBlockNeeded or ((NewBlockNeeded = False) and (ParentNode <> nil)) then
   begin
   begin
     if ParentNode = nil then
     if ParentNode = nil then
-      ParentNode := TIndexNode.Create(FWriteStream);
-
+      begin
+        ParentNode := TIndexNode.Create(FWriteStream);
+        OwnsParentNode:=True;
+      end;
     ParentNode.ChildIsFull(FLastWord, FLastNodeStart);
     ParentNode.ChildIsFull(FLastWord, FLastNodeStart);
     if (NewBlockNeeded = False) then
     if (NewBlockNeeded = False) then
       ParentNode.Flush(False);
       ParentNode.Flush(False);
@@ -675,7 +689,10 @@ begin
   if NewBlockNeeded then
   if NewBlockNeeded then
   begin
   begin
     if ParentNode = nil then
     if ParentNode = nil then
-      ParentNode := TIndexNode.Create(FWriteStream);
+      begin
+        ParentNode := TIndexNode.Create(FWriteStream);
+        OwnsParentNode:=True;
+      end;
   end;
   end;
 
 
   if ParentNode <> nil then
   if ParentNode <> nil then

+ 30 - 11
packages/chm/src/chmfilewriter.pas

@@ -26,10 +26,10 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, chmwriter;
   Classes, SysUtils, chmwriter;
-  
+
 type
 type
   TChmProject = class;
   TChmProject = class;
-  
+
   TChmProgressCB = procedure (Project: TChmProject; CurrentFile: String) of object;
   TChmProgressCB = procedure (Project: TChmProject; CurrentFile: String) of object;
 
 
   { TChmProject }
   { TChmProject }
@@ -42,6 +42,7 @@ type
     FFiles: TStrings;
     FFiles: TStrings;
     FIndexFileName: String;
     FIndexFileName: String;
     FMakeBinaryTOC: Boolean;
     FMakeBinaryTOC: Boolean;
+    FMakeBinaryIndex: Boolean;
     FMakeSearchable: Boolean;
     FMakeSearchable: Boolean;
     FFileName: String;
     FFileName: String;
     FOnProgress: TChmProgressCB;
     FOnProgress: TChmProgressCB;
@@ -66,12 +67,13 @@ type
     property AutoFollowLinks: Boolean read FAutoFollowLinks write FAutoFollowLinks;
     property AutoFollowLinks: Boolean read FAutoFollowLinks write FAutoFollowLinks;
     property TableOfContentsFileName: String read FTableOfContentsFileName write FTableOfContentsFileName;
     property TableOfContentsFileName: String read FTableOfContentsFileName write FTableOfContentsFileName;
     property MakeBinaryTOC: Boolean read FMakeBinaryTOC write FMakeBinaryTOC;
     property MakeBinaryTOC: Boolean read FMakeBinaryTOC write FMakeBinaryTOC;
+    property MakeBinaryIndex: Boolean read FMakeBinaryIndex write FMakeBinaryIndex;
     property Title: String read FTitle write FTitle;
     property Title: String read FTitle write FTitle;
     property IndexFileName: String read FIndexFileName write FIndexFileName;
     property IndexFileName: String read FIndexFileName write FIndexFileName;
     property MakeSearchable: Boolean read FMakeSearchable write FMakeSearchable;
     property MakeSearchable: Boolean read FMakeSearchable write FMakeSearchable;
     property DefaultPage: String read FDefaultPage write FDefaultPage;
     property DefaultPage: String read FDefaultPage write FDefaultPage;
     property DefaultFont: String read FDefaultFont write FDefaultFont;
     property DefaultFont: String read FDefaultFont write FDefaultFont;
-    
+
     property OnProgress: TChmProgressCB read FOnProgress write FOnProgress;
     property OnProgress: TChmProgressCB read FOnProgress write FOnProgress;
   end;
   end;
 
 
@@ -90,7 +92,7 @@ begin
   // clean up the filename
   // clean up the filename
   FileName := StringReplace(ExtractFileName(DataName), '\', '/', [rfReplaceAll]);
   FileName := StringReplace(ExtractFileName(DataName), '\', '/', [rfReplaceAll]);
   FileName := StringReplace(FileName, '//', '/', [rfReplaceAll]);
   FileName := StringReplace(FileName, '//', '/', [rfReplaceAll]);
-  
+
   PathInChm := '/'+ExtractFilePath(DataName);
   PathInChm := '/'+ExtractFilePath(DataName);
   if Assigned(FOnProgress) then FOnProgress(Self, DataName);
   if Assigned(FOnProgress) then FOnProgress(Self, DataName);
 end;
 end;
@@ -100,13 +102,28 @@ var
   IndexStream: TFileStream;
   IndexStream: TFileStream;
   TOCStream: TFileStream;
   TOCStream: TFileStream;
   Writer: TChmWriter;
   Writer: TChmWriter;
-  TOCSitemap: TChmSiteMap;
+  TOCSitemap  : TChmSiteMap;
+  IndexSiteMap: TChmSiteMap;
 begin
 begin
   // Assign the TOC and index files
   // Assign the TOC and index files
   Writer := TChmWriter(Sender);
   Writer := TChmWriter(Sender);
+  {$ifdef chmindex}
+    Writeln('binindex filename ',IndexFileName);
+  {$endif}
   if (IndexFileName <> '') and FileExists(IndexFileName) then begin
   if (IndexFileName <> '') and FileExists(IndexFileName) then begin
     IndexStream := TFileStream.Create(IndexFileName, fmOpenRead);
     IndexStream := TFileStream.Create(IndexFileName, fmOpenRead);
     Writer.AppendIndex(IndexStream);
     Writer.AppendIndex(IndexStream);
+    if MakeBinaryIndex then
+    begin
+      {$ifdef chmindex}
+        Writeln('into binindex ');
+      {$endif}
+      IndexStream.Position := 0;
+      IndexSitemap := TChmSiteMap.Create(stIndex);
+      indexSitemap.LoadFromStream(IndexStream);
+      Writer.AppendBinaryIndexFromSiteMap(IndexSitemap,False);
+      IndexSitemap.Free;	
+    end;
     IndexStream.Free;
     IndexStream.Free;
   end;
   end;
   if (TableOfContentsFileName <> '') and FileExists(TableOfContentsFileName) then begin
   if (TableOfContentsFileName <> '') and FileExists(TableOfContentsFileName) then begin
@@ -145,7 +162,7 @@ begin
   Cfg := TXMLConfig.Create(nil);
   Cfg := TXMLConfig.Create(nil);
   Cfg.Filename := AFileName;
   Cfg.Filename := AFileName;
   FileName := AFileName;
   FileName := AFileName;
-  
+
   Files.Clear;
   Files.Clear;
   FileCount := Cfg.GetValue('Files/Count/Value', 0);
   FileCount := Cfg.GetValue('Files/Count/Value', 0);
   for I := 0 to FileCount-1 do begin
   for I := 0 to FileCount-1 do begin
@@ -153,8 +170,9 @@ begin
   end;
   end;
   IndexFileName := Cfg.GetValue('Files/IndexFile/Value','');
   IndexFileName := Cfg.GetValue('Files/IndexFile/Value','');
   TableOfContentsFileName := Cfg.GetValue('Files/TOCFile/Value','');
   TableOfContentsFileName := Cfg.GetValue('Files/TOCFile/Value','');
+  // For chm file merging, bintoc must be false and binindex true. Change defaults in time?
   MakeBinaryTOC := Cfg.GetValue('Files/MakeBinaryTOC/Value', True);
   MakeBinaryTOC := Cfg.GetValue('Files/MakeBinaryTOC/Value', True);
-  
+  MakeBinaryIndex:= Cfg.GetValue('Files/MakeBinaryIndex/Value', False);
   AutoFollowLinks := Cfg.GetValue('Settings/AutoFollowLinks/Value', False);
   AutoFollowLinks := Cfg.GetValue('Settings/AutoFollowLinks/Value', False);
   MakeSearchable := Cfg.GetValue('Settings/MakeSearchable/Value', False);
   MakeSearchable := Cfg.GetValue('Settings/MakeSearchable/Value', False);
   DefaultPage := Cfg.GetValue('Settings/DefaultPage/Value', '');
   DefaultPage := Cfg.GetValue('Settings/DefaultPage/Value', '');
@@ -181,7 +199,7 @@ begin
   Cfg.SetValue('Files/IndexFile/Value', IndexFileName);
   Cfg.SetValue('Files/IndexFile/Value', IndexFileName);
   Cfg.SetValue('Files/TOCFile/Value', TableOfContentsFileName);
   Cfg.SetValue('Files/TOCFile/Value', TableOfContentsFileName);
   Cfg.SetValue('Files/MakeBinaryTOC/Value',MakeBinaryTOC);
   Cfg.SetValue('Files/MakeBinaryTOC/Value',MakeBinaryTOC);
-
+  Cfg.SetValue('Files/MakeBinaryIndex/Value',MakeBinaryIndex);
   Cfg.SetValue('Settings/AutoFollowLinks/Value', AutoFollowLinks);
   Cfg.SetValue('Settings/AutoFollowLinks/Value', AutoFollowLinks);
   Cfg.SetValue('Settings/MakeSearchable/Value', MakeSearchable);
   Cfg.SetValue('Settings/MakeSearchable/Value', MakeSearchable);
   Cfg.SetValue('Settings/DefaultPage/Value', DefaultPage);
   Cfg.SetValue('Settings/DefaultPage/Value', DefaultPage);
@@ -212,7 +230,7 @@ begin
   // our callback to get data
   // our callback to get data
   Writer.OnGetFileData := @GetData;
   Writer.OnGetFileData := @GetData;
   Writer.OnLastFile    := @LastFileAdded;
   Writer.OnLastFile    := @LastFileAdded;
-  
+
   // give it the list of files
   // give it the list of files
   Writer.FilesToCompress.AddStrings(Files);
   Writer.FilesToCompress.AddStrings(Files);
 
 
@@ -222,10 +240,11 @@ begin
   Writer.DefaultFont := DefaultFont;
   Writer.DefaultFont := DefaultFont;
   Writer.FullTextSearch := MakeSearchable;
   Writer.FullTextSearch := MakeSearchable;
   Writer.HasBinaryTOC := MakeBinaryTOC;
   Writer.HasBinaryTOC := MakeBinaryTOC;
-  
+  Writer.HasBinaryIndex := MakeBinaryIndex;
+
   // and write!
   // and write!
   Writer.Execute;
   Writer.Execute;
-  
+
   if Assigned(TOCStream) then TOCStream.Free;
   if Assigned(TOCStream) then TOCStream.Free;
   if Assigned(IndexStream) then IndexStream.Free;
   if Assigned(IndexStream) then IndexStream.Free;
 end;
 end;

+ 239 - 3
packages/chm/src/chmreader.pas

@@ -116,7 +116,8 @@ type
   public
   public
     function GetContextUrl(Context: THelpContext): String;
     function GetContextUrl(Context: THelpContext): String;
     function LookupTopicByID(ATopicID: Integer; out ATitle: String): String; // returns a url
     function LookupTopicByID(ATopicID: Integer; out ATitle: String): String; // returns a url
-    function GetTOCSitemap: TChmSiteMap;
+    function GetTOCSitemap(ForceXML:boolean=false): TChmSiteMap;
+    function GetIndexSitemap(ForceXML:boolean=false): TChmSiteMap;
     function HasContextList: Boolean;
     function HasContextList: Boolean;
     property DefaultPage: String read fDefaultPage;
     property DefaultPage: String read fDefaultPage;
     property IndexFile: String read fIndexFile;
     property IndexFile: String read fIndexFile;
@@ -875,7 +876,241 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TChmReader.GetTOCSitemap: TChmSiteMap;
+const DefBlockSize = 2048;
+
+function LoadBtreeHeader(m:TMemoryStream;var btreehdr:TBtreeHeader):boolean;
+
+begin
+  if m.size<sizeof(TBtreeHeader) Then
+    Exit(False);
+  result:=true;
+  m.read(btreeHdr,sizeof(TBtreeHeader));
+  {$IFDEF ENDIAN_BIG}
+     btreehdr.flags         :=LEToN(btreehdr.flags);
+     btreehdr.blocksize     :=LEToN(btreehdr.blocksize);
+     btreehdr.lastlstblock  :=LEToN(btreehdr.lastlstblock);
+     btreehdr.indexrootblock:=LEToN(btreehdr.indexrootblock);
+     btreehdr.nrblock       :=LEToN(btreehdr.nrblock);
+     btreehdr.treedepth     :=LEToN(btreehdr.treedepth);
+     btreehdr.nrkeywords    :=LEToN(btreehdr.nrkeywords);
+     btreehdr.codepage      :=LEToN(btreehdr.codepage);
+     btreehdr.lcid          :=LEToN(btreehdr.lcid);
+     btreehdr.ischm         :=LEToN(btreehdr.ischm);
+  {$endif}
+end;
+
+function readwcharstring(var head:pbyte;tail:pbyte;var readv : ansistring):boolean;
+
+var pw      : PWord;
+    oldhead : PByte;
+    ws      : WideString;
+    n       : Integer;
+begin
+  oldhead:=head;
+  pw:=pword(head);
+  while (pw<pword(tail)) and (pw^<>word(0)) do
+    inc(pw);
+  inc(pw); // skip #0#0.
+  head:=pbyte(pw);
+  result:=head<tail;
+
+  n:=head-oldhead;
+  setlength(ws,n div sizeof(widechar));
+  move(oldhead^,ws[1],n);
+  for n:=1 to length(ws) do
+    word(ws[n]):=LEToN(word(ws[n]));
+  readv:=ws; // force conversion for now, and hope it doesn't require cwstring
+end;
+
+function TChmReader.GetIndexSitemap(ForceXML:boolean=false): TChmSiteMap;
+var Index   : TMemoryStream;
+    sitemap : TChmSiteMap;
+    Item    : TChmSiteMapItem;
+    
+function  AbortAndTryTextual:tchmsitemap;
+
+begin
+     if Assigned(Index) Then Index.Free;
+     // Second Try text Index
+     Index := GetObject(IndexFile);
+     if Index <> nil then
+     begin
+       Result := TChmSiteMap.Create(stIndex);
+       Result.LoadFromStream(Index);
+       Index.Free;
+     end
+    else
+      result:=nil;
+end;
+
+procedure createentry(Name:ansistring;CharIndex:integer;Topic,Title:ansistring);
+var litem : TChmSiteMapItem;
+    shortname : ansistring;
+    longpart  : ansistring;
+begin
+ if charindex=0 then
+   begin
+     item:=sitemap.items.NewItem;
+     item.keyword:=Name;
+     item.local:=topic;
+     item.text:=title;
+   end
+ else
+   begin
+     shortname:=copy(name,1,charindex-2);
+     longpart:=copy(name,charindex,length(name)-charindex+1);
+     if assigned(item) and (shortname=item.text) then
+       begin
+         litem:=item.children.newitem;
+         litem.local:=topic;
+         litem.keyword :=longpart; // recursively split this? No examples.
+         litem.text:=title;
+       end
+      else
+       begin
+         item:=sitemap.items.NewItem;
+         item.keyword:=shortname;
+         item.local:=topic;
+         item.text:=title;
+         litem:=item.children.newitem;
+         litem.keyword:=longpart;
+         litem.local:=topic;
+         litem.text :=Title; // recursively split this? No examples.
+       end;
+   end;  
+end;
+
+procedure parselistingblock(p:pbyte);
+var hdr:PBTreeBlockHeader;
+    head,tail : pbyte;
+    isseealso,
+    nrpairs : Integer;
+    i : integer;
+    PE : PBtreeBlockEntry;
+    title : string;
+    CharIndex,
+    ind:integer;
+    seealsostr,
+    topic,
+    Name : AnsiString;
+    item : TChmSiteMapItem;
+begin
+  hdr:=PBTreeBlockHeader(p);
+  hdr^.Length          :=LEToN(hdr^.Length);
+  hdr^.NumberOfEntries :=LEToN(hdr^.NumberOfEntries);
+  hdr^.IndexOfPrevBlock:=LEToN(hdr^.IndexOfPrevBlock);
+  hdr^.IndexOfNextBlock:=LEToN(hdr^.IndexOfNextBlock);
+
+  tail:=p+(2048-hdr^.length);
+  head:=p+sizeof(TBtreeBlockHeader);
+  
+  {$ifdef binindex}
+  writeln('previndex  : ',hdr^.IndexOfPrevBlock);
+  writeln('nextindex  : ',hdr^.IndexOfNextBlock);
+  {$endif}
+  while head<tail do
+    begin
+      if not ReadWCharString(Head,Tail,Name) Then
+        Break;
+      {$ifdef binindex}
+         Writeln('name : ',name);
+      {$endif}
+       if (head+sizeof(TBtreeBlockEntry))>=tail then
+         break;
+      PE :=PBtreeBlockEntry(head);
+      NrPairs  :=LEToN(PE^.nrpairs);
+      IsSeealso:=LEToN(PE^.isseealso);
+      CharIndex:=LEToN(PE^.CharIndex);
+      {$ifdef binindex}
+        Writeln('seealso:     ',IsSeeAlso);
+        Writeln('entrydepth:  ',LEToN(PE^.entrydepth));
+        Writeln('charindex :  ',charindex );
+        Writeln('Nrpairs   :  ',NrPairs);
+        writeln('seealso data : ');
+      {$endif}
+
+      inc(head,sizeof(TBtreeBlockEntry));
+      if isseealso>0 then
+        begin
+          if not ReadWCharString(Head,Tail,SeeAlsoStr) Then
+            Break;
+          // have to figure out first what to do with it.
+        end
+      else
+        begin
+         if NrPairs>0 Then
+            for i:=0 to nrpairs-1 do
+              begin
+                if head<tail Then
+                  begin
+                    ind:=LEToN(plongint(head)^);
+                    topic:=lookuptopicbyid(ind,title);
+                    {$ifdef binindex}
+                      writeln(i:3,' topic: ',topic);
+                      writeln('    title: ',title);
+                    {$endif}
+                    inc(head,4);
+                  end;
+              end;
+          end;
+      if nrpairs<>0 Then
+        createentry(Name,CharIndex,Topic,Title);
+      inc(head,4); // always 1
+      {$ifdef binindex}
+        if head<tail then
+        writeln('Zero based index (13 higher than last) :',plongint(head)^);
+      {$endif}
+      inc(head,4); // zero based index (13 higher than last
+    end;
+end;
+
+var TryTextual : boolean;
+    BHdr       : TBTreeHeader;
+    block      : Array[0..2047] of Byte;
+    i          : Integer;
+begin
+   Result := nil;  SiteMap:=Nil;
+   // First Try Binary
+   Index := GetObject('/$WWKeywordLinks/BTree');
+   if (Index = nil) or ForceXML then
+   begin
+     Result:=AbortAndTryTextual;
+     Exit;
+   end;
+   if not CheckCommonStreams then
+   begin
+     Result:=AbortAndTryTextual;
+     Exit;
+   end;
+   SiteMap:=TChmSitemap.Create(StIndex);
+   Item   :=Nil;  // cached last created item, in case we need to make 
+                  // a child.
+   TryTextual:=True;
+   BHdr.LastLstBlock:=0;
+   if LoadBtreeHeader(index,BHdr) and (BHdr.LastLstBlock>0) Then
+    begin 
+       if BHdr.BlockSize=defblocksize then
+         begin
+           for i:=0 to BHdr.lastlstblock do
+             begin
+               if (index.size-index.position)>=defblocksize then
+                 begin
+                   Index.read(block,defblocksize);
+                   parselistingblock(@block)
+                end;
+             end;
+            trytextual:=false;
+            result:=sitemap; 
+          end;   
+    end;
+  if trytextual then
+    begin
+      sitemap.free;
+      Result:=AbortAndTryTextual;
+    end;
+end;
+
+function TChmReader.GetTOCSitemap(ForceXML:boolean=false): TChmSiteMap;
     function AddTOCItem(TOC: TStream; AItemOffset: DWord; SiteMapITems: TChmSiteMapItems): DWord;
     function AddTOCItem(TOC: TStream; AItemOffset: DWord; SiteMapITems: TChmSiteMapItems): DWord;
     var
     var
       Props: DWord;
       Props: DWord;
@@ -919,8 +1154,9 @@ begin
    Result := nil;
    Result := nil;
    // First Try Binary
    // First Try Binary
    TOC := GetObject('/#TOCIDX');
    TOC := GetObject('/#TOCIDX');
-   if TOC = nil then
+   if (TOC = nil) or ForceXML then
    begin
    begin
+     if Assigned(TOC) Then Toc.Free;
      // Second Try text toc
      // Second Try text toc
      TOC := GetObject(TOCFile);
      TOC := GetObject(TOCFile);
      if TOC <> nil then
      if TOC <> nil then

+ 14 - 3
packages/chm/src/chmsitemap.pas

@@ -124,6 +124,7 @@ type
     FUseFolderImages: Boolean;
     FUseFolderImages: Boolean;
     FWindowName: String;
     FWindowName: String;
     FLevel: Integer;
     FLevel: Integer;
+    FLevelForced: Boolean;
     FWindowStyles: LongInt;
     FWindowStyles: LongInt;
     procedure SetItems(const AValue: TChmSiteMapItems);
     procedure SetItems(const AValue: TChmSiteMapItems);
   protected
   protected
@@ -202,7 +203,7 @@ begin
   else begin // looking for /HTML
   else begin // looking for /HTML
     if TagName = '/HTML' then Exclude(FSiteMapTags, smtHTML);
     if TagName = '/HTML' then Exclude(FSiteMapTags, smtHTML);
   end;}
   end;}
-  
+
   //if (smtHTML in FSiteMapTags) then begin
   //if (smtHTML in FSiteMapTags) then begin
      if not (smtBODY in FSiteMapTags) then begin
      if not (smtBODY in FSiteMapTags) then begin
        if TagName = 'BODY' then Include(FSiteMapTags, smtBODY);
        if TagName = 'BODY' then Include(FSiteMapTags, smtBODY);
@@ -210,7 +211,7 @@ begin
      else begin
      else begin
        if TagName = '/BODY' then Exclude(FSiteMapTags, smtBODY);
        if TagName = '/BODY' then Exclude(FSiteMapTags, smtBODY);
      end;
      end;
-     
+
      if (smtBODY in FSiteMapTags) then begin
      if (smtBODY in FSiteMapTags) then begin
        //WriteLn('GOT TAG: ', AActualTag);
        //WriteLn('GOT TAG: ', AActualTag);
        if TagName = 'UL' then begin
        if TagName = 'UL' then begin
@@ -221,16 +222,26 @@ begin
          //WriteLN('Dec Level');
          //WriteLN('Dec Level');
          DecreaseULevel;
          DecreaseULevel;
        end
        end
+       else if (TagName = 'LI') and (FLevel = 0) then
+         FLevelForced := True
        else if TagName = 'OBJECT' then begin
        else if TagName = 'OBJECT' then begin
          Include(FSiteMapBodyTags, smbtOBJECT);
          Include(FSiteMapBodyTags, smbtOBJECT);
+         if FLevelForced then
+           IncreaseULevel;
          If FLevel > 0 then // if it is zero it is the site properties
          If FLevel > 0 then // if it is zero it is the site properties
            NewSiteMapItem;
            NewSiteMapItem;
        end
        end
        else if TagName = '/OBJECT' then begin
        else if TagName = '/OBJECT' then begin
          Exclude(FSiteMapBodyTags, smbtOBJECT);
          Exclude(FSiteMapBodyTags, smbtOBJECT);
+         if FLevelForced then
+         begin
+           DecreaseULevel;
+           FLevelForced := False;
+         end;
        end
        end
        else begin // we are the properties of the object tag
        else begin // we are the properties of the object tag
-         if (smbtOBJECT in FSiteMapBodyTags) then begin
+         if (FLevel > 0 ) and (smbtOBJECT in FSiteMapBodyTags) then begin
+
            if LowerCase(GetTagName(AActualTag)) = 'param' then begin
            if LowerCase(GetTagName(AActualTag)) = 'param' then begin
 
 
              TagAttributeName := GetVal(AActualTag, 'name');
              TagAttributeName := GetVal(AActualTag, 'name');

+ 61 - 9
packages/chm/src/chmtypes.pas

@@ -25,13 +25,13 @@ unit chmtypes;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils; 
-  
+  Classes, SysUtils;
+
 type
 type
   TSectionName = (snMSCompressed, snUnCompressed);
   TSectionName = (snMSCompressed, snUnCompressed);
-  
+
   TSectionNames = set of TSectionName;
   TSectionNames = set of TSectionName;
-  
+
    { TDirectoryChunk }
    { TDirectoryChunk }
 
 
   TDirectoryChunk = class(TObject)
   TDirectoryChunk = class(TObject)
@@ -52,7 +52,7 @@ type
     property ItemCount: Word read FItemCount;
     property ItemCount: Word read FItemCount;
     constructor Create(AHeaderSize: Integer);
     constructor Create(AHeaderSize: Integer);
   end;
   end;
-  
+
   { TPMGIDirectoryChunk }
   { TPMGIDirectoryChunk }
 
 
   TPMGIDirectoryChunk = class(TDirectoryChunk)
   TPMGIDirectoryChunk = class(TDirectoryChunk)
@@ -134,8 +134,60 @@ type
     Unknown: Word; // 0,2,4,8,10,12,16,32
     Unknown: Word; // 0,2,4,8,10,12,16,32
   end;
   end;
 
 
+  TBtreeHeader = packed record
+                        ident          : array[0..1] of ansichar; // $3B $29
+                        flags          : word;	// bit $2 is always 1, bit $0400 1 if dir? (always on)
+                        blocksize      : word;  // size of blocks (2048)
+                        dataformat     : array[0..15] of ansichar;  // "X44" always the same, see specs.
+                        unknown0       : dword; // always 0
+			lastlstblock   : dword; // index of last listing block in the file;
+                        indexrootblock : dword; // Index of the root block in the file.
+                        unknown1       : dword; // always -1
+                        nrblock	       : dword; // Number of blocks
+                        treedepth      : word;  // The depth of the tree of blocks (1 if no index blocks, 2 one level of index blocks, ...)
+                        nrkeywords     : dword; // number of keywords in the file.
+                        codepage       : dword; // Windows code page identifier (usually 1252 - Windows 3.1 US (ANSI))
+			lcid	       : dword; // LCID from the HHP file.
+                        ischm	       : dword; // 0 if this a BTREE and is part of a CHW file, 1 if it is a BTree and is part of a CHI or CHM file
+                        unknown2       : dword; // Unknown. Almost always 10031. Also 66631 (accessib.chm, ieeula.chm, iesupp.chm, iexplore.chm, msoe.chm, mstask.chm, ratings.chm, wab.chm).
+                        unknown3       : dword; // unknown 0
+		        unknown4       : dword; // unknown 0
+			unknown5       : dword; // unknown 0
+                      end;
+  PBTreeBlockHeader = ^TBtreeBlockHeader;
+  TBtreeBlockHeader = packed record
+                        Length             : word;  // Length of free space at the end of the block.
+                        NumberOfEntries    : word;  // Number of entries in the block.
+                        IndexOfPrevBlock   : dword; // Index of the previous block. -1 if this is the first listing block.
+                        IndexOfNextBlock   : dword; // Index of the next block. -1 if this is the last listing block.
+                      end;
+
+  PBtreeBlockEntry = ^TBtreeBlockEntry;
+  TBtreeBlockEntry = packed record
+                        isseealso  : word; // 2 if this keyword is a See Also keyword, 0 if it is not.
+                        entrydepth : word; // Depth of this entry into the tree.
+                        charindex  : dword;// Character index of the last keyword in the ", " separated list.
+                        unknown0   : dword;// 0 (unknown)
+                        NrPairs    : dword;// Number of Name, Local pairs
+                      end;
+
+  PBtreeIndexBlockHeader = ^TBtreeIndexBlockHeader;
+  TBtreeIndexBlockHeader = packed record
+                        length             : word;  // Length of free space at the end of the block.
+                        NumberOfEntries    : word;  // Number of entries in the block.
+                        IndexOfChildBlock  : dword; // Index of Child Block
+                      end;
+
+  PBtreeIndexBlockEntry = ^TBtreeIndexBlockEntry;
+  TBtreeIndexBlockEntry = packed record
+                        isseealso  : word; // 2 if this keyword is a See Also keyword, 0 if it is not.
+                        entrydepth : word; // Depth of this entry into the tree.
+                        charindex  : dword;// Character index of the last keyword in the ", " separated list.
+                        unknown0   : dword;// 0 (unknown)
+                        NrPairs    : dword;// Number of Name, Local pairs
+                      end;
 
 
-  function PageBookInfoRecordSize(ARecord: PTOCEntryPageBookInfo): Integer;
+function PageBookInfoRecordSize(ARecord: PTOCEntryPageBookInfo): Integer;
 
 
 implementation
 implementation
 uses chmbase;
 uses chmbase;
@@ -174,7 +226,7 @@ begin
   Move(Data^, Buffer[CurrentPos], Size);
   Move(Data^, Buffer[CurrentPos], Size);
   Inc(CurrentPos, Size);
   Inc(CurrentPos, Size);
   Inc(FItemCount);
   Inc(FItemCount);
-  
+
   // now put a quickref entry if needed
   // now put a quickref entry if needed
   if ItemCount mod 5 = 0 then begin
   if ItemCount mod 5 = 0 then begin
     Inc(FQuickRefEntries);
     Inc(FQuickRefEntries);
@@ -312,7 +364,7 @@ begin
   WriteChunkToStream(Stream);
   WriteChunkToStream(Stream);
   NewPos := Stream.Position;
   NewPos := Stream.Position;
   Inc(FChunkLevelCount);
   Inc(FChunkLevelCount);
-  
+
   if Final and (ChunkLevelCount < 2) then begin
   if Final and (ChunkLevelCount < 2) then begin
     FParentChunk.Free;
     FParentChunk.Free;
     FParentChunk := nil;
     FParentChunk := nil;
@@ -332,7 +384,7 @@ begin
   if not FParentChunk.CanHold(WriteSize) then begin
   if not FParentChunk.CanHold(WriteSize) then begin
     FinishBlock;
     FinishBlock;
   end;
   end;
-  
+
   FParentChunk.WriteEntry(WriteSize, @NewBuffer[0]);
   FParentChunk.WriteEntry(WriteSize, @NewBuffer[0]);
   if Final then FinishBlock;
   if Final then FinishBlock;
   //WriteLn(ChunkLevelCount);
   //WriteLn(ChunkLevelCount);

File diff suppressed because it is too large
+ 629 - 38
packages/chm/src/chmwriter.pas


+ 529 - 0
packages/chm/src/lzxcompressthread.pas

@@ -0,0 +1,529 @@
+{ Copyright (C) <2009> <Andrew Haines> lzxcompressthread.pas
+
+  This library is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Library General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or (at your
+  option) any later version.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+  for more details.
+
+  You should have received a copy of the GNU Library General Public License
+  along with this library; if not, write to the Free Software Foundation,
+  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+{
+  See the file COPYING.FPC, included in this distribution,
+  for details about the copyright.
+}
+unit lzxcompressthread;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, paslzxcomp;
+
+type
+  TLZXCompressor = class;
+  TLZXMasterThread = class;
+  TLZXWorkerThread = class;
+
+  TLZXGetDataMethod = function(Sender: TLZXCompressor; WantedByteCount: Integer; Buffer: Pointer): Integer of object;
+  TLZXIsEndOfFileMethod = function(Sender: TLZXCompressor): Boolean  of object;
+  TLZXChunkDoneMethod = procedure(Sender: TLZXCompressor; CompressedSize: Integer; UncompressedSize: Integer; Buffer: Pointer) of object;
+  TLZXMarkFrameMethod = procedure(Sender: TLZXCompressor; CompressedSize: Integer; UncompressedSize: Integer) of object;
+
+  PLZXFinishedBlock = ^TLZXFinishedBlock;
+  TLZXFinishedBlock = record
+    CompressedSize: Integer;
+    UnCompressedSize: Integer;
+    Frame1CSize,
+    Frame1USize,
+    Frame2CSize,
+    Frame2USize: Integer;
+    Index: Integer;
+    Data: Pointer;
+  end;
+
+  { TLZXCompressor }
+
+  TLZXCompressor = class(TObject)
+  private
+    FOnMarkFrame: TLZXMarkFrameMethod;
+    FThreadCount: Integer;
+    FBlockSize: Integer;
+    FTotalCompressedSize: DWord;
+    FTotalUnCompressedSize: DWord;
+    FOnChunkDone: TLZXChunkDoneMethod;
+    FOnGetData: TLZXGetDataMethod;
+    FOnIsEndOfFile: TLZXIsEndOfFileMethod;
+    FWindowSizeCode: Integer;
+    FinishedBlocks: TFPList;
+    NextBlockNeeded: Integer;
+    FMasterThread: TLZXMasterThread;
+    procedure BlockIsFinished(ABlock: PLZXFinishedBlock);
+    function GetRunning: Boolean;
+  public
+    constructor Create(AThreadCount: Integer);
+    destructor  Destroy; override;
+
+    procedure   Execute(WaitForFinish: Boolean = True);
+
+    property BlockSize: Integer read FBlockSize write FBlockSize;
+    property Running: Boolean read GetRunning;
+    property WindowSizeCode: Integer read FWindowSizeCode write FWindowSizeCode;
+
+    // the following properties must all be assigned
+    property OnGetData: TLZXGetDataMethod read FOnGetData write FOnGetData;
+    property OnChunkDone: TLZXChunkDoneMethod read FOnChunkDone write FOnChunkDone;
+    property OnIsEndOfFile: TLZXIsEndOfFileMethod read FOnIsEndOfFile write FOnIsEndOfFile;
+    property OnMarkFrame: TLZXMarkFrameMethod read FOnMarkFrame write FOnMarkFrame;
+  end;
+
+  { TLZXMasterThread }
+
+  TLZXMasterThread = class(TThread)
+    FCompressor: TLZXCompressor;
+    FBusyThreads: TFPList;
+    FLockData: TRTLCriticalSection;
+    FLockQueueThread: TRTLCriticalSection;
+    FDataRemains: Boolean;
+    FBlockNumber: Integer;
+    FRunning: Boolean;
+    FMemList: TFPList;
+
+    // only used inside a critical section!!
+    // belongs to a Worker thread which will free it
+    FTmpData: Pointer;
+    FTmpDataSize: Integer;
+
+    procedure UpdateDataRemains;
+
+    function  BlockDone(Worker: TLZXWorkerThread; ABlock: PLZXFinishedBlock): Boolean;
+    procedure WorkerFinished(Sender: TObject);
+    function GetFreeMemoryChunk: Pointer;
+
+
+    procedure Lock;
+    Procedure UnLock;
+    procedure LockTmpData;
+    procedure UnLockTmpData;
+    function Working: Boolean;
+    function DataRemains: Boolean;
+    function Running: Boolean;
+    function QueueThread(Thread: TLZXWorkerThread): Boolean;
+
+  public
+    procedure   Execute; override;
+    constructor Create(Compressor: TLZXCompressor);
+    destructor  Destroy; override;
+  end;
+
+  { TLZXWorkerThread }
+
+  TLZXWorkerThread = class(TThread)
+  private
+    Data: PByte;
+    DataSize: Integer;
+    DataCursor: Integer;
+    Frame1C,
+    Frame1U,
+    Frame2C,
+    Frame2U: Integer;
+
+    LZXData: Plzx_data;
+
+    CompressedData: PByte;
+    CompressedDataSize: Integer; // compressed written size. not the size of the array
+
+    BlockNumber: Integer;
+
+    WindowSizeCode: Integer;
+    BlockSize: Integer;
+
+    MasterThread: TLZXMasterThread;
+    ShouldSuspend: Boolean;
+
+    // callbacks for lzxcomp
+    function    GetBytes(ACount: Longint; ABuffer: Pointer): LongInt; cdecl;
+    function    WriteBytes(ACount: LongInt; ABuffer: Pointer): LongInt; cdecl;
+    procedure   MarkFrame(UnCompressedSize: DWord; CompressedSize: DWord); cdecl;
+    function    IsEndOfFile: LongBool; cdecl;
+    // end callbacks
+    procedure   NotifyMasterDone;
+  protected
+    procedure   Execute; override;
+  public
+    procedure   CompressData(ABlockNumber: Integer);
+
+    constructor Create(AMaster: TLZXMasterThread; AWindowSizeCode: Integer; ABlockSize: Integer);
+    destructor  Destroy; override;
+  end;
+
+implementation
+uses
+  Sysutils; // for Sleep()
+
+{ TLZXCompressor }
+
+procedure TLZXCompressor.BlockIsFinished(ABlock: PLZXFinishedBlock);
+  procedure SendChunk(AChunk: PLZXFinishedBlock);
+  begin
+    if Assigned(FOnMarkFrame) then
+    begin
+      Inc(FTotalCompressedSize, AChunk^.Frame1CSize);
+      Inc(FTotalUnCompressedSize, AChunk^.Frame1USize);
+      Inc(NextBlockNeeded);
+
+      FOnMarkFrame(Self, FTotalCompressedSize, FTotalUnCompressedSize);
+
+      if AChunk^.Frame2CSize > 0 then
+      begin
+        Inc(FTotalCompressedSize, AChunk^.Frame2CSize);
+        Inc(FTotalUnCompressedSize, AChunk^.Frame2USize);
+        FOnMarkFrame(Self, FTotalCompressedSize, FTotalUnCompressedSize);
+      end;
+    end;
+
+    FOnChunkDone(Self, AChunk^.CompressedSize, AChunk^.UnCompressedSize, AChunk^.Data);
+    FMasterThread.FMemList.Add(AChunk^.Data);
+    Dispose(AChunk);
+  end;
+var
+  TmpBlock  : PLZXFinishedBlock;
+  FoundMatch: Boolean;
+  i: Integer;
+
+begin
+  if NextBlockNeeded = ABlock^.Index then
+    SendChunk(ABlock)
+  else
+    FinishedBlocks.Add(ABlock);
+
+  repeat
+    FoundMatch := False;
+    for i := FinishedBlocks.Count-1 downto 0 do
+    begin
+      TmpBlock := PLZXFinishedBlock(FinishedBlocks.Items[i]);
+      if TmpBlock^.Index = NextBlockNeeded then
+      begin
+        FoundMatch := True;
+        SendChunk(TmpBlock);
+        FinishedBlocks.Delete(i);
+      end;
+    end;
+  until not FoundMatch;
+end;
+
+function TLZXCompressor.GetRunning: Boolean;
+begin
+  Result := FMasterThread.Running;
+end;
+
+constructor TLZXCompressor.Create(AThreadCount: Integer);
+begin
+  inherited Create;
+  FThreadCount    := AThreadCount;
+  FBlockSize      := 1 shl 16 ; // $10000;
+  FWindowSizeCode := 16;
+  FMasterThread := TLZXMasterThread.Create(Self);
+  FinishedBlocks := TFPList.Create;
+end;
+
+destructor TLZXCompressor.Destroy;
+begin
+  FMasterThread.Free;
+  FinishedBlocks.Free;
+  inherited Destroy;
+end;
+
+procedure TLZXCompressor.Execute(WaitForFinish: Boolean = True);
+begin
+    FTotalCompressedSize := 0;
+    FTotalUnCompressedSize := 0;
+    FMasterThread.FRunning:=True;
+    FMasterThread.Resume;
+    if WaitForFinish then
+      While Running do
+        CheckSynchronize(50);
+end;
+
+{ TLZXMasterThread }
+
+procedure TLZXMasterThread.UpdateDataRemains;
+begin
+  FDataRemains := not FCompressor.FOnIsEndOfFile(FCompressor);
+end;
+
+function TLZXMasterThread.BlockDone(Worker: TLZXWorkerThread; ABlock: PLZXFinishedBlock): Boolean;
+begin
+  Lock;
+  REsult := True;
+  FCompressor.BlockIsFinished(ABlock);
+  if DataRemains then
+    QueueThread(Worker)
+  else
+  begin
+    Result := False;
+    FBusyThreads.Remove(Worker);
+    Worker.Terminate;
+    if FBusyThreads.Count = 0 then
+      Resume;
+  end;
+  Unlock;
+end;
+
+procedure TLZXMasterThread.WorkerFinished(Sender: TObject);
+begin
+  FBusyThreads.Remove(Sender);
+  if TThread(Sender).FatalException <> nil then
+    Raise Exception(TThread(Sender).FatalException);
+  Sender.Free;
+end;
+
+function TLZXMasterThread.GetFreeMemoryChunk: Pointer;
+begin
+  if FMemList.Count >0 then
+  begin
+    Result := FMemList.Items[0];
+    FMemList.Delete(0);
+  end
+  else
+    Result := Getmem(FCompressor.BlockSize);
+end;
+
+procedure TLZXMasterThread.Lock;
+begin
+  EnterCriticalsection(FLockData);
+end;
+
+procedure TLZXMasterThread.UnLock;
+begin
+  LeaveCriticalsection(FLockData);
+end;
+
+procedure TLZXMasterThread.LockTmpData;
+begin
+  EnterCriticalsection(FLockQueueThread);
+end;
+
+procedure TLZXMasterThread.UnLockTmpData;
+begin
+  LeaveCriticalsection(FLockQueueThread);
+end;
+
+function TLZXMasterThread.Working: Boolean;
+begin
+  Result := FBusyThreads.Count > 0;
+end;
+
+function TLZXMasterThread.DataRemains: Boolean;
+begin
+  UpdateDataRemains;
+  Result := FDataRemains;
+end;
+
+function TLZXMasterThread.Running: Boolean;
+begin
+  REsult := FRunning;
+end;
+
+function TLZXMasterThread.QueueThread(Thread: TLZXWorkerThread): Boolean;
+begin
+  LockTmpData;
+
+  Result := DataRemains;
+  if Not Result then
+  begin
+    UnLockTmpData;
+    Exit;
+  end;
+
+  FDataRemains := False;
+
+  Thread.DataSize := FCompressor.OnGetData(FCompressor, FCompressor.FBlockSize, Thread.Data);
+
+  Thread.CompressData(FBlockNumber);
+  Inc(FBlockNumber);
+  Thread.Resume;
+  UnLockTmpData;
+end;
+
+procedure TLZXMasterThread.Execute;
+var
+  i: Integer;
+  Thread: TLZXWorkerThread;
+begin
+  FRunning:= True;
+  for i := 0 to FCompressor.FThreadCount-1 do
+  begin
+    Thread := TLZXWorkerThread.Create(Self, FCompressor.WindowSizeCode, FCompressor.BlockSize);
+    Thread.FreeOnTerminate := True;
+    Thread.OnTerminate:= @WorkerFinished;
+    if QueueThread(Thread) then
+      FBusyThreads.Add(Thread);
+  end;
+  //Suspend;
+  while Working do
+  begin
+      Sleep(50);
+  end;
+  FRunning:= False;
+end;
+
+constructor TLZXMasterThread.Create(Compressor: TLZXCompressor);
+begin
+  Inherited Create(True);
+  FCompressor  := Compressor;
+  FDataRemains := True;
+  FBusyThreads := TFPList.Create;
+  FMemList := TFPList.Create;
+  InitCriticalSection(FLockData);
+  InitCriticalSection(FLockQueueThread);
+end;
+
+destructor TLZXMasterThread.Destroy;
+var
+  i: Integer;
+begin
+  DoneCriticalsection(FLockData);
+  DoneCriticalsection(FLockQueueThread);
+
+  for i := 0 to FBusyThreads.Count-1 do TObject(FBusyThreads.Items[i]).Free;
+  for i := 0 to FMemList.Count-1 do Freemem(FMemList.Items[i]);
+
+  FBusyThreads.Free;
+  FMemList.Free;
+
+  inherited Destroy;
+end;
+
+{ TLZXWorkerThread }
+
+function TLZXWorkerThread.GetBytes(ACount: Longint; ABuffer: Pointer): LongInt; cdecl;
+var
+  MaxBytes: Integer;
+begin
+  MaxBytes := DataSize - DataCursor;
+
+  if ACount > MaxBytes then
+    ACount := MaxBytes;
+
+  Move(Data[DataCursor], ABuffer^, ACount);
+  Inc(DataCursor, ACount);
+
+  Result := ACount;
+end;
+
+function TLZXWorkerThread.WriteBytes(ACount: LongInt; ABuffer: Pointer
+  ): LongInt; cdecl;
+begin
+  Move(ABuffer^, CompressedData[CompressedDataSize], ACount);
+  Inc(CompressedDataSize, ACount);
+  Result := ACount;
+end;
+
+procedure TLZXWorkerThread.MarkFrame(UnCompressedSize: DWord;
+  CompressedSize: DWord); cdecl;
+begin
+  if Frame1C = 0 then
+  begin
+    Frame1C := CompressedSize;
+    Frame1U := UnCompressedSize;
+  end
+  else
+  begin
+    Frame2C := CompressedSize;
+    Frame2U := UnCompressedSize;
+  end;
+end;
+
+function TLZXWorkerThread.IsEndOfFile: LongBool; cdecl;
+begin
+  Result := LongBool(DataSize - DataCursor <= 0);
+end;
+
+procedure TLZXWorkerThread.NotifyMasterDone;
+var
+  Block: PLZXFinishedBlock;
+begin
+  LZXData^.len_compressed_output:=0;
+  LZXData^.len_uncompressed_input:=0;
+
+  New(Block);
+  Block^.Data            :=  MasterThread.GetFreeMemoryChunk;
+  Move(CompressedData^, Block^.Data^, CompressedDataSize);
+  Block^.CompressedSize  := CompressedDataSize;
+  Block^.UnCompressedSize:= DataSize;
+  Block^.Index           := BlockNumber;
+  Block^.Frame1CSize      := Frame1C;
+  Block^.Frame2CSize      := Frame2C-Frame1C;
+  Block^.Frame1USize      := Frame1U;
+  Block^.Frame2USize      := Frame2U-Frame1U;
+
+  Frame1C := 0;
+  Frame2C := 0;
+  Frame1U := 0;
+  Frame2U := 0;
+
+  ShouldSuspend := not MasterThread.BlockDone(Self, Block);
+
+end;
+
+procedure TLZXWorkerThread.CompressData(ABlockNumber: Integer);
+begin
+  BlockNumber := ABlockNumber;
+  DataCursor := 0;
+  CompressedDataSize := 0;
+end;
+
+procedure TLZXWorkerThread.Execute;
+var
+  WSize: LongInt;
+begin
+  WSize := 1 shl WindowSizeCode;
+  while not Terminated do
+  begin
+    lzx_reset(LZXdata);
+    lzx_compress_block(LZXdata, WSize, True);
+
+    MasterThread.Synchronize(@NotifyMasterDone);
+
+    if ShouldSuspend then
+      Suspend;
+  end;
+end;
+
+constructor TLZXWorkerThread.Create(AMaster: TLZXMasterThread;
+  AWindowSizeCode: Integer; ABlockSize: Integer);
+begin
+  Inherited Create(True);
+  MasterThread := AMaster;
+  WindowSizeCode := AWindowSizeCode;
+  BlockSize     := ABlockSize;
+  FreeOnTerminate := True;
+
+  Data  := GetMem(ABlockSize);
+  CompressedData:=GetMem(ABlockSize);
+
+  lzx_init(@LZXdata, longint(WindowSizeCode),
+           TGetBytesFunc(@TLZXWorkerThread.GetBytes), Self,
+           TIsEndOfFileFunc(@TLZXWorkerThread.IsEndOfFile),
+           TWriteBytesFunc(@TLZXWorkerThread.WriteBytes), Self,
+           TMarkFrameFunc(@TLZXWorkerThread.MarkFrame), Self);
+end;
+
+destructor TLZXWorkerThread.Destroy;
+begin
+  lzx_finish(LZXdata, nil);
+  Freemem(Data);
+  FreeMem(CompressedData);
+  inherited Destroy;
+end;
+
+end.
+

+ 10 - 9
packages/chm/src/paslzxcomp.pas

@@ -710,11 +710,11 @@ begin
     end
     end
     else begin
     else begin
       mask_bits := (1 shl shift_bits) - 1;
       mask_bits := (1 shl shift_bits) - 1;
-      lzxd^.bit_buf := lzxd^.bit_buf shl shift_bits;
-      lzxd^.bit_buf := lzxd^.bit_buf or (bits shr rshift_bits) and mask_bits;
+      lzxd^.bit_buf := word(lzxd^.bit_buf shl shift_bits);
+      lzxd^.bit_buf := word(lzxd^.bit_buf or (bits shr rshift_bits) and mask_bits);
     end;
     end;
 {$IFDEF ENDIAN_BIG}
 {$IFDEF ENDIAN_BIG}
-    lzxd^.bit_buf := ((lzxd^.bit_buf and $FF)shl 8) or (lzxd^.bit_buf shr 8);
+    lzxd^.bit_buf := word(((lzxd^.bit_buf and $FF)shl 8) or (lzxd^.bit_buf shr 8));
 {$ENDIF}
 {$ENDIF}
     lzxd^.put_bytes(lzxd^.out_arg, sizeof(lzxd^.bit_buf), @lzxd^.bit_buf);
     lzxd^.put_bytes(lzxd^.out_arg, sizeof(lzxd^.bit_buf), @lzxd^.bit_buf);
     Inc(lzxd^.len_compressed_output, sizeof(lzxd^.bit_buf));
     Inc(lzxd^.len_compressed_output, sizeof(lzxd^.bit_buf));
@@ -726,8 +726,8 @@ begin
   //   otherwise move bits in */
   //   otherwise move bits in */
   shift_bits := nbits;
   shift_bits := nbits;
   mask_bits := (1 shl shift_bits) - 1;
   mask_bits := (1 shl shift_bits) - 1;
-  lzxd^.bit_buf := lzxd^.bit_buf shl shift_bits;
-  lzxd^.bit_buf := lzxd^.bit_buf or bits and mask_bits;
+  lzxd^.bit_buf := word(lzxd^.bit_buf shl shift_bits);
+  lzxd^.bit_buf := word(lzxd^.bit_buf or bits and mask_bits);
   Inc(cur_bits, nbits);
   Inc(cur_bits, nbits);
 
 
   lzxd^.bits_in_buf := cur_bits;
   lzxd^.bits_in_buf := cur_bits;
@@ -892,8 +892,8 @@ begin
 	  Inc(freqs[19]);
 	  Inc(freqs[19]);
 	  //* right, MS lies again.  Code is NOT
 	  //* right, MS lies again.  Code is NOT
 	  //   prev_len + len (mod 17), it's prev_len - len (mod 17)*/
 	  //   prev_len + len (mod 17), it's prev_len - len (mod 17)*/
-	  codep^ := prevlengths[i-cur_run] - last_len;
-	  if (codep^ > 16) then Inc(codep^, 17);
+	  codep^ := byte(prevlengths[i-cur_run] - last_len);
+	  if (codep^ > 16) then codep^ := byte(codep^ + 17); //Inc(codep^, 17);
 	  Inc(freqs[codep^]);
 	  Inc(freqs[codep^]);
           Inc(codep);
           Inc(codep);
 	  runp^ := 0; //* not necessary */
 	  runp^ := 0; //* not necessary */
@@ -901,8 +901,8 @@ begin
 	  Dec(cur_run, excess+4);
 	  Dec(cur_run, excess+4);
         end;
         end;
 	while (cur_run > 0) do begin
 	while (cur_run > 0) do begin
-	  codep^ := prevlengths[i-cur_run] - last_len;
-	  if (codep^ > 16) then Inc(codep^, 17);
+	  codep^ := byte(prevlengths[i-cur_run] - last_len);
+	  if (codep^ > 16) then codep^ := byte(codep^ + 17); //Inc(codep^, byte(17));
 	  runp^ := 0; //* not necessary */
 	  runp^ := 0; //* not necessary */
           Inc(runp);
           Inc(runp);
 	  Dec(cur_run);
 	  Dec(cur_run);
@@ -1151,6 +1151,7 @@ begin
   freemem(lzxd^.prev_main_treelengths);
   freemem(lzxd^.prev_main_treelengths);
   freemem(lzxd^.main_tree);
   freemem(lzxd^.main_tree);
   freemem(lzxd^.main_freq_table);
   freemem(lzxd^.main_freq_table);
+  freemem(lzxd^.block_codes);
   dispose(lzxd);
   dispose(lzxd);
   Exit(0);
   Exit(0);
 end;
 end;

+ 27 - 83
packages/fcl-base/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/08/02]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/10/02]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
@@ -273,19 +273,19 @@ ifeq ($(OS_TARGET),win64)
 INSTALL_DATADIR=${INSTALL_UNITDIR}
 INSTALL_DATADIR=${INSTALL_UNITDIR}
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs daemonapp ServiceManager fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
@@ -294,10 +294,10 @@ ifeq ($(FULL_TARGET),i386-haiku)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -306,13 +306,13 @@ ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -333,13 +333,13 @@ ifeq ($(FULL_TARGET),i386-symbian)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -348,7 +348,7 @@ ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -357,10 +357,10 @@ ifeq ($(FULL_TARGET),m68k-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -369,7 +369,7 @@ ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -378,40 +378,40 @@ ifeq ($(FULL_TARGET),powerpc-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs daemonapp ServiceManager fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs  fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs fptimer
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  fileinfo syncobjs fptimer
@@ -429,10 +429,10 @@ ifeq ($(FULL_TARGET),arm-symbian)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -441,7 +441,7 @@ ifeq ($(FULL_TARGET),avr-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs daemonapp fptimer
+override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85  syncobjs   fptimer
 endif
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
 ifeq ($(FULL_TARGET),armeb-embedded)
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
 override TARGET_UNITS+=contnrs inifiles rtfpars idea base64 gettext iostream cachecls avl_tree uriparser eventlog custapp wformat whtml wtex rttiutils bufstream streamex blowfish streamio inicol pooledmm libtar streamcoll maskutils fpexprpars ascii85
@@ -1924,8 +1924,6 @@ REQUIRE_PACKAGES_RTL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
-REQUIRE_PACKAGES_WINUNITS-BASE=1
-REQUIRE_PACKAGES_WINUNITS-JEDI=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -2049,8 +2047,6 @@ REQUIRE_PACKAGES_UNIVINT=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
-REQUIRE_PACKAGES_WINUNITS-BASE=1
-REQUIRE_PACKAGES_WINUNITS-JEDI=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
@@ -2125,58 +2121,6 @@ ifdef UNITDIR_RTL
 override COMPILER_UNITDIR+=$(UNITDIR_RTL)
 override COMPILER_UNITDIR+=$(UNITDIR_RTL)
 endif
 endif
 endif
 endif
-ifdef REQUIRE_PACKAGES_WINUNITS-BASE
-PACKAGEDIR_WINUNITS-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_WINUNITS-BASE),)
-ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)),)
-UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)
-else
-UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_WINUNITS-BASE) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_WINUNITS-BASE=
-UNITDIR_WINUNITS-BASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_WINUNITS-BASE),)
-UNITDIR_WINUNITS-BASE:=$(firstword $(UNITDIR_WINUNITS-BASE))
-else
-UNITDIR_WINUNITS-BASE=
-endif
-endif
-ifdef UNITDIR_WINUNITS-BASE
-override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-BASE)
-endif
-endif
-ifdef REQUIRE_PACKAGES_WINUNITS-JEDI
-PACKAGEDIR_WINUNITS-JEDI:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_WINUNITS-JEDI),)
-ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)),)
-UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)
-else
-UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_WINUNITS-JEDI) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_WINUNITS-JEDI=
-UNITDIR_WINUNITS-JEDI:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_WINUNITS-JEDI),)
-UNITDIR_WINUNITS-JEDI:=$(firstword $(UNITDIR_WINUNITS-JEDI))
-else
-UNITDIR_WINUNITS-JEDI=
-endif
-endif
-ifdef UNITDIR_WINUNITS-JEDI
-override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-JEDI)
-endif
-endif
 ifdef REQUIRE_PACKAGES_UNIVINT
 ifdef REQUIRE_PACKAGES_UNIVINT
 PACKAGEDIR_UNIVINT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /univint/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_UNIVINT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /univint/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_UNIVINT),)
 ifneq ($(PACKAGEDIR_UNIVINT),)

+ 8 - 10
packages/fcl-base/Makefile.fpc

@@ -7,8 +7,6 @@ name=fcl-base
 version=2.5.1
 version=2.5.1
 
 
 [require]
 [require]
-packages_win32=winunits-base winunits-jedi
-packages_win64=winunits-base winunits-jedi
 packages_darwin=univint
 packages_darwin=univint
 
 
 [target]
 [target]
@@ -19,14 +17,14 @@ units=contnrs inifiles rtfpars idea base64 gettext \
       maskutils fpexprpars ascii85
       maskutils fpexprpars ascii85
 units_beos=syncobjs
 units_beos=syncobjs
 units_haiku=syncobjs
 units_haiku=syncobjs
-units_freebsd=syncobjs daemonapp fptimer
-units_darwin=syncobjs daemonapp fptimer
-units_solaris=syncobjs daemonapp fptimer
-units_netbsd=daemonapp fptimer
-units_openbsd=daemonapp fptimer
-units_linux=syncobjs daemonapp fptimer
-units_win32=fileinfo syncobjs daemonapp ServiceManager fptimer
-units_win64=fileinfo syncobjs daemonapp ServiceManager fptimer
+units_freebsd=syncobjs fptimer
+units_darwin=syncobjs fptimer
+units_solaris=syncobjs fptimer
+units_netbsd=  fptimer
+units_openbsd= fptimer
+units_linux=syncobjs   fptimer
+units_win32=fileinfo syncobjs  fptimer
+units_win64=fileinfo syncobjs  fptimer
 units_wince=fileinfo syncobjs fptimer
 units_wince=fileinfo syncobjs fptimer
 # syncobjs requires GetLastOSError function
 # syncobjs requires GetLastOSError function
 units_netware=syncobjs
 units_netware=syncobjs

+ 3 - 3
packages/fcl-db/src/codegen/fpcgtiopf.pp

@@ -340,7 +340,7 @@ begin
   EndMethod(Strings,S);
   EndMethod(Strings,S);
   // AcceptVisitor
   // AcceptVisitor
   S:=BeginAcceptVisitor(Strings,C,ObjectClassName);
   S:=BeginAcceptVisitor(Strings,C,ObjectClassName);
-  AddLn(Strings,'Result:=Result and (Visited.ObjectState in [posCreate,posdelete,posUpdate]);');
+  AddLn(Strings,'Result:=Result and (Visited.ObjectState in [posCreate,posDelete,posUpdate]);');
   DecIndent;
   DecIndent;
   EndMethod(Strings,S);
   EndMethod(Strings,S);
   S:=BeginSetupParams(Strings,C,ObjectClassName,True);
   S:=BeginSetupParams(Strings,C,ObjectClassName,True);
@@ -431,7 +431,7 @@ begin
   // Common setup case
   // Common setup case
   If (V in [voCreate,voUpdate]) and (UseCommonSetupParams) then
   If (V in [voCreate,voUpdate]) and (UseCommonSetupParams) then
     A:=Format('TUpdateCreate%sVisitor',[StripType(ObjectClassName)])
     A:=Format('TUpdateCreate%sVisitor',[StripType(ObjectClassName)])
-  else If (V in [voCreate,voDelete,voUpdate,voCommonSetupParams]) then
+  else If (V in [voCreate,voDelete,voUpdate,voCommonSetupParams,voSingleSaveVisitor]) then
     A:='TtiVisitorUpdate'
     A:='TtiVisitorUpdate'
   else
   else
     A:='TtiVisitorSelect';
     A:='TtiVisitorSelect';
@@ -1226,7 +1226,7 @@ begin
 end;
 end;
 
 
 Initialization
 Initialization
-  RegisterCodeGenerator('tiOPF','tiOPF class and visitors for the data',TTiOPFCodeGenerator);
+  RegisterCodeGenerator('tiOPF','tiOPF classes and hard-coded visitors for the data',TTiOPFCodeGenerator);
 
 
 Finalization
 Finalization
   UnRegisterCodeGenerator(TTiOPFCodeGenerator);
   UnRegisterCodeGenerator(TTiOPFCodeGenerator);

+ 2 - 0
packages/fcl-db/src/codegen/fpddcodegen.pp

@@ -1279,6 +1279,8 @@ begin
     begin
     begin
     Addln(Strings,'Unit '+CodeOptions.UnitName+';');
     Addln(Strings,'Unit '+CodeOptions.UnitName+';');
     Addln(Strings);
     Addln(Strings);
+    Addln(Strings, '{$mode objfpc}{$H+}');
+    Addln(Strings);
     Addln(Strings,'Interface');
     Addln(Strings,'Interface');
     Addln(Strings);
     Addln(Strings);
     S:=GetInterfaceUsesClause;
     S:=GetInterfaceUsesClause;

+ 3 - 3
packages/fcl-db/src/datadict/fpddfb.pp

@@ -459,7 +459,7 @@ Var
 
 
   {Opmerking: bestaande fielddefs die niet meer in de tabel zitten worden niet verwijderd !? }
   {Opmerking: bestaande fielddefs die niet meer in de tabel zitten worden niet verwijderd !? }
 
 
-  function ImportFieldDef : boolean;
+  function ImportFieldDef(APosition : Integer) : boolean;
   var FD : TDDFieldDef;
   var FD : TDDFieldDef;
       n, s : string;
       n, s : string;
   begin
   begin
@@ -497,7 +497,7 @@ Var
         FD.Required:=false
         FD.Required:=false
     else
     else
       FD.Required:=false;
       FD.Required:=false;
-    FD.index := FPosition.AsInteger;
+    FD.index := APosition;
     s := trim(FDomainName.asstring);
     s := trim(FDomainName.asstring);
     if copy(s, 1, 4) <> 'RDB$' then
     if copy(s, 1, 4) <> 'RDB$' then
       FD.DomainName := s
       FD.DomainName := s
@@ -513,7 +513,7 @@ Var
     BindFields;
     BindFields;
     while not Q.eof do
     while not Q.eof do
       begin
       begin
-      if ImportFieldDef then
+      if ImportFieldDef(Result) then
         inc (result);
         inc (result);
       Q.Next;
       Q.Next;
       end;
       end;

+ 25 - 7
packages/fcl-db/src/export/fpdbexport.pp

@@ -72,8 +72,10 @@ Type
     FTimeFormat : String;
     FTimeFormat : String;
     FDateTimeFormat : String;
     FDateTimeFormat : String;
     FDecimalSeparator: Char;
     FDecimalSeparator: Char;
+    FUseDisplayText : Boolean;
   Protected
   Protected
     Procedure InitSettings; virtual;
     Procedure InitSettings; virtual;
+    Property UseDisplayText : Boolean Read FUseDisplayText Write FUseDisplayText;
     Property IntegerFormat : String Read FIntegerFormat Write FIntegerFormat;
     Property IntegerFormat : String Read FIntegerFormat Write FIntegerFormat;
     Property DecimalSeparator : Char Read FDecimalSeparator Write FDecimalSeparator;
     Property DecimalSeparator : Char Read FDecimalSeparator Write FDecimalSeparator;
     Property CurrencySymbol : String Read FCurrencySymbol Write FCurrencySymbol;
     Property CurrencySymbol : String Read FCurrencySymbol Write FCurrencySymbol;
@@ -587,8 +589,10 @@ begin
     begin
     begin
     If (FormatSettings.IntegerFormat)<>'' then
     If (FormatSettings.IntegerFormat)<>'' then
       Result:=Format(FormatSettings.IntegerFormat,[F.AsInteger])
       Result:=Format(FormatSettings.IntegerFormat,[F.AsInteger])
+    else if FormatSettings.UseDisplayText then
+      Result:=F.DisplayText
     else
     else
-      Result:=F.AsString;
+      Result:=F.AsString;  
     end
     end
   else if (F.DataType=ftBoolean) then
   else if (F.DataType=ftBoolean) then
     begin
     begin
@@ -597,12 +601,17 @@ begin
     else
     else
       Result:=FormatSettings.BooleanFalse;
       Result:=FormatSettings.BooleanFalse;
     If (Result='') then
     If (Result='') then
-      Result:=F.AsString;
+      if FormatSettings.UseDisplayText then
+        Result:=F.DisplayText
+      else
+        Result:=F.AsString;  
     end
     end
   else if (F.DataType=ftDate) then
   else if (F.DataType=ftDate) then
     begin
     begin
     If (FormatSettings.DateFormat<>'') then
     If (FormatSettings.DateFormat<>'') then
       Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
       Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
+    else if FormatSettings.UseDisplayText then
+      Result:=F.DisplayText
     else
     else
       Result:=F.AsString;
       Result:=F.AsString;
     end
     end
@@ -610,16 +619,20 @@ begin
     begin
     begin
     If (FormatSettings.TimeFormat<>'') then
     If (FormatSettings.TimeFormat<>'') then
       Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
       Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
+    else if FormatSettings.UseDisplayText then
+      Result:=F.DisplayText
     else
     else
-      Result:=F.AsString;
+      Result:=F.AsString;  
     end
     end
   else if (F.DataType in [ftDateTime,ftTimeStamp]) then
   else if (F.DataType in [ftDateTime,ftTimeStamp]) then
     begin
     begin
     If (FormatSettings.DateTimeFormat<>'') then
     If (FormatSettings.DateTimeFormat<>'') then
       Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
       Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
+    else if FormatSettings.UseDisplayText then
+      Result:=F.DisplayText
     else
     else
       Result:=F.AsString;
       Result:=F.AsString;
-    end
+    end 
   else if (F.DataType=ftCurrency) then
   else if (F.DataType=ftCurrency) then
     begin
     begin
     If (FormatSettings.CurrencySymbol<>'') then
     If (FormatSettings.CurrencySymbol<>'') then
@@ -628,11 +641,15 @@ begin
       FS.CurrencyString:=FormatSettings.CurrencySymbol;
       FS.CurrencyString:=FormatSettings.CurrencySymbol;
       Result:=CurrToStrF(F.AsCurrency,ffCurrency,FormatSettings.CurrencyDigits,FS);
       Result:=CurrToStrF(F.AsCurrency,ffCurrency,FormatSettings.CurrencyDigits,FS);
       end
       end
-    else
-      Result:=F.AsString
+    else  if FormatSettings.UseDisplayText then
+      Result:=F.DisplayText
+    else 
+      Result:=F.AsString;
     end
     end
+  else if FormatSettings.UseDisplayText then
+    Result:=F.DisplayText
   else
   else
-    Result:=F.AsString;
+    Result:=F.AsString;  
 end;
 end;
 
 
 procedure TCustomDatasetExporter.ExportError(Msg: String);
 procedure TCustomDatasetExporter.ExportError(Msg: String);
@@ -852,6 +869,7 @@ begin
     FTimeFormat:=FS.FTimeFormat;
     FTimeFormat:=FS.FTimeFormat;
     FDateTimeFormat:=FS.FDateTimeFormat;
     FDateTimeFormat:=FS.FDateTimeFormat;
     FDecimalSeparator:=FS.FDecimalSeparator;
     FDecimalSeparator:=FS.FDecimalSeparator;
+    FUseDisplayText:=FS.FUseDisplayText;
     end
     end
   else
   else
     inherited Assign(Source);
     inherited Assign(Source);

+ 16 - 7
packages/fcl-db/src/paradox/paradox.pp

@@ -417,6 +417,7 @@ Var
   pxf : Ppxfield_t;
   pxf : Ppxfield_t;
 
 
 begin
 begin
+  FieldDefs.Clear;
   pxf:=PX_get_fields(FDoc);
   pxf:=PX_get_fields(FDoc);
   ACount:= PX_get_num_fields(FDoc);
   ACount:= PX_get_num_fields(FDoc);
   ReallocMem(FOffsets,ACount*SizeOf(Integer));
   ReallocMem(FOffsets,ACount*SizeOf(Integer));
@@ -549,6 +550,9 @@ end;
 procedure TParadox.InternalClose;
 procedure TParadox.InternalClose;
 
 
 begin
 begin
+  BindFields(False);
+  if DefaultFields then
+    DestroyFields;
   FreeAndNil(FParser);
   FreeAndNil(FParser);
   FreeMem(FOffsets);
   FreeMem(FOffsets);
   FOffSets:=Nil;
   FOffSets:=Nil;
@@ -629,7 +633,7 @@ var
   No,pft,flen : integer;
   No,pft,flen : integer;
   pxf          : PPx_field;
   pxf          : PPx_field;
   Value        : Pchar;
   Value        : Pchar;
-  Y,M,D        : cint;
+  D            : clong;
   longv        : Clong;
   longv        : Clong;
   R            : Double;
   R            : Double;
   c            : Char;
   c            : Char;
@@ -652,7 +656,9 @@ begin
         If result then
         If result then
           begin
           begin
           Move(Value^,Buffer^,flen);
           Move(Value^,Buffer^,flen);
-          doc^.free(doc,value);
+          If (Flen<=Field.DataSize) then
+            Pchar(Buffer)[flen]:=#0;
+          FDoc^.free(FDoc,value);
           end;
           end;
         end;
         end;
       pxfDate:
       pxfDate:
@@ -660,8 +666,11 @@ begin
         Result:=PX_get_data_long(FDoc,Buf,flen,@longv)>0;
         Result:=PX_get_data_long(FDoc,Buf,flen,@longv)>0;
         If Result then
         If Result then
           begin
           begin
-          PX_SdnToGregorian(longv+1721425,@Y,@M,@D);
-          PDateTime(Buffer)^:=EncodeDate(Y,M,D);
+          // 1721425 is the number of the days between the start of the
+          // julian calendar (4714 BC) and jan-00-0000 (Paradox base date)
+          // 2415019 is the number of the days between the start of the
+          // julian calendar (4714 BC) and dec-30-1899 (TDateTime base date)
+          PDateTime(Buffer)^:=Longv+1721425-2415019;
           end;
           end;
         end;
         end;
       pxfShort:
       pxfShort:
@@ -688,7 +697,7 @@ begin
         begin
         begin
         Result:=(PX_get_data_byte(FDoc,Buf,flen,@C)>0);
         Result:=(PX_get_data_byte(FDoc,Buf,flen,@C)>0);
         If result then
         If result then
-          PBoolean(Buffer)^:=(C<>#0);
+          PWordBool(Buffer)^:=(C<>#0);
         end;
         end;
       pxfBytes:
       pxfBytes:
         begin
         begin
@@ -721,9 +730,9 @@ begin
           begin
           begin
           R:=R/1000.0;
           R:=R/1000.0;
           longv:=trunc(R /86400);
           longv:=trunc(R /86400);
-          PX_SdnToGregorian(longv+1721425,@Y,@M,@D);
+          D:=Longv+1721425-2415019;
           longv:=(Trunc(r) mod 86400);
           longv:=(Trunc(r) mod 86400);
-          PDateTime(Buffer)^:=EncodeDate(Y,M,d)+(Longv/MSecsPerday);
+          PDateTime(Buffer)^:=D+(Longv/MSecsPerday);
           end;
           end;
         end;
         end;
       pxfBCD:
       pxfBCD:

+ 8 - 6
packages/fcl-db/src/sqldb/interbase/ibconnection.pp

@@ -555,7 +555,12 @@ begin
           SQLData := AllocMem(in_SQLDA^.SQLVar[x].SQLLen+2)
           SQLData := AllocMem(in_SQLDA^.SQLVar[x].SQLLen+2)
         else
         else
           SQLData := AllocMem(in_SQLDA^.SQLVar[x].SQLLen);
           SQLData := AllocMem(in_SQLDA^.SQLVar[x].SQLLen);
-        if (sqltype and 1) = 1 then New(SQLInd);
+        // Always force the creation of slqind for parameters. It could be
+        // that a database-trigger takes care of inserting null-values, so
+        // it should always be possible to pass null-parameters. If that fails,
+        // the database-server will generate the appropiate error.
+        sqltype := sqltype or 1;
+        new(sqlind);
         end;
         end;
       {$R+}
       {$R+}
       end
       end
@@ -778,13 +783,10 @@ begin
     ParNr := ParamBinding[SQLVarNr];
     ParNr := ParamBinding[SQLVarNr];
     VSQLVar := @in_sqlda^.SQLvar[SQLVarNr];
     VSQLVar := @in_sqlda^.SQLvar[SQLVarNr];
     if AParams[ParNr].IsNull then
     if AParams[ParNr].IsNull then
-      begin
-      If Assigned(VSQLVar^.SQLInd) then
-        VSQLVar^.SQLInd^ := -1;
-      end
+      VSQLVar^.SQLInd^ := -1
     else
     else
       begin
       begin
-      if assigned(VSQLVar^.SQLInd) then VSQLVar^.SQLInd^ := 0;
+      VSQLVar^.SQLInd^ := 0;
 
 
       case (VSQLVar^.sqltype and not 1) of
       case (VSQLVar^.sqltype and not 1) of
         SQL_LONG :
         SQL_LONG :

+ 5 - 3
packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

@@ -338,17 +338,19 @@ begin
 end;
 end;
 
 
 procedure TConnectionName.DoInternalConnect;
 procedure TConnectionName.DoInternalConnect;
+var ClientVerStr: string;
 begin
 begin
   InitialiseMysql;
   InitialiseMysql;
+  ClientVerStr := copy(strpas(mysql_get_client_info()),1,3);
 {$IFDEF mysql50}
 {$IFDEF mysql50}
-  if copy(strpas(mysql_get_client_info()),1,3)<>'5.0' then
+  if (ClientVerStr<>'5.0') and (ClientVerStr<>'5.1') then
     Raise EInOutError.CreateFmt(SErrNotversion50,[strpas(mysql_get_client_info())]);
     Raise EInOutError.CreateFmt(SErrNotversion50,[strpas(mysql_get_client_info())]);
 {$ELSE}
 {$ELSE}
   {$IFDEF mysql41}
   {$IFDEF mysql41}
-  if copy(strpas(mysql_get_client_info()),1,3)<>'4.1' then
+  if ClientVerStr<>'4.1' then
     Raise EInOutError.CreateFmt(SErrNotversion41,[strpas(mysql_get_client_info())]);
     Raise EInOutError.CreateFmt(SErrNotversion41,[strpas(mysql_get_client_info())]);
   {$ELSE}
   {$ELSE}
-  if copy(strpas(mysql_get_client_info()),1,3)<>'4.0' then
+  if ClientVerStr<>'4.0' then
     Raise EInOutError.CreateFmt(SErrNotversion40,[strpas(mysql_get_client_info())]);
     Raise EInOutError.CreateFmt(SErrNotversion40,[strpas(mysql_get_client_info())]);
   {$ENDIF}
   {$ENDIF}
 {$ENDIF}
 {$ENDIF}

+ 14 - 8
packages/fcl-db/src/sqldb/sqldb.pp

@@ -1504,17 +1504,23 @@ begin
                qry := FUpdateQry;
                qry := FUpdateQry;
                end;
                end;
     ukInsert : begin
     ukInsert : begin
-               if not assigned(FInsertQry) and (trim(FInsertSQL.Text)<> '') then
-                 InitialiseModifyQuery(FInsertQry,FInsertSQL.Text)
-               else
-                 InitialiseModifyQuery(FInsertQry,InsertRecQuery);
+               if not assigned(FInsertQry) then
+                 begin
+                 if (trim(FInsertSQL.Text)<> '') then
+                   InitialiseModifyQuery(FInsertQry,FInsertSQL.Text)
+                 else
+                   InitialiseModifyQuery(FInsertQry,InsertRecQuery);
+                 end;
                qry := FInsertQry;
                qry := FInsertQry;
                end;
                end;
     ukDelete : begin
     ukDelete : begin
-               if not assigned(FDeleteQry) and (trim(FDeleteSQL.Text)<> '') then
-                 InitialiseModifyQuery(FDeleteQry,FDeleteSQL.Text)
-               else
-                 InitialiseModifyQuery(FDeleteQry,DeleteRecQuery);
+               if not assigned(FDeleteQry) then
+                 begin
+                 if (trim(FDeleteSQL.Text)<> '') then
+                   InitialiseModifyQuery(FDeleteQry,FDeleteSQL.Text)
+                 else
+                   InitialiseModifyQuery(FDeleteQry,DeleteRecQuery);
+                 end;
                qry := FDeleteQry;
                qry := FDeleteQry;
                end;
                end;
   end;
   end;

Some files were not shown because too many files changed in this diff