Bläddra i källkod

* merged r13762-14047 from trunk

git-svn-id: branches/objc@14048 -
Jonas Maebe 15 år sedan
förälder
incheckning
559e284bd0
100 ändrade filer med 10067 tillägg och 4527 borttagningar
  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/errorptw.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/msgidx.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/htmlindexer.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/paslzx.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/contnrs.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/eventlog.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/streamio.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/uriparser.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/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/fclel.mc -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/testsqlscript.pas svneol=native#text/plain
 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.fpc 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/gdbint/Makefile 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/testgdb.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/wanddemo.dpr 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/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/compare.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/commdlg.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/flatsb.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/uxtheme.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/tests/OOHelper.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/fpmake.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.txt 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/strings.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/prt0.as svneol=native#text/plain
 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/arm/at91sam7x256.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/empty.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/tb0561b.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/ub0060.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/t4cc1.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/tabsvr1.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/tasmread.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/tbrtlevt.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/tclass7.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/tcmp.pp svneol=native#text/plain
 tests/test/tcmp0.pp svneol=native#text/plain
 tests/test/tendian1.pp svneol=native#text/plain
 tests/test/tenum1.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/testda1.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/texception9.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/tfpu2.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/tobject3.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/toperator2.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/trtti4.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/tsel2.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/tstrreal3.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/tunistr1.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/tw14248.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/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/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/tw1599b.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/tw14514.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/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/tw1479.pp svneol=native#text/plain
+tests/webtbs/tw14812.pp svneol=native#text/plain
 tests/webtbs/tw1485.pp svneol=native#text/plain
 tests/webtbs/tw1489.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/README.txt 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_htmlchm.inc 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/converu.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/h2plexlib.pas svneol=native#text/plain
 utils/h2pas/h2poptions.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/testit.h -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/ptopu.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/sim_pasc/Answers svneol=native#text/plain
 utils/sim_pasc/ChangeLog svneol=native#text/plain

+ 11 - 0
compiler/aasmtai.pas

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

+ 6 - 1
compiler/aggas.pas

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

+ 7 - 0
compiler/alpha/cgcpu.pas

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

+ 51 - 0
compiler/arm/aasmcpu.pas

@@ -103,6 +103,8 @@ uses
       { co proc. ld/st operations }
       OT_AM5       = $00080000;
       OT_AMMASK    = $000f0000;
+      { IT instruction }
+      OT_CONDITION = $00100000;
 
       OT_MEMORYAM2 = OT_MEMORY or OT_AM2;
       OT_MEMORYAM3 = OT_MEMORY or OT_AM3;
@@ -159,6 +161,7 @@ uses
          roundingmode : troundingmode;
          procedure loadshifterop(opidx:longint;const so:tshifterop);
          procedure loadregset(opidx:longint;const s:tcpuregisterset);
+         procedure loadconditioncode(opidx:longint;const cond:tasmcond);
          constructor op_none(op : tasmop);
 
          constructor op_reg(op : tasmop;_op1 : tregister);
@@ -180,6 +183,9 @@ uses
          { SFM/LFM }
          constructor op_reg_const_ref(op : tasmop;_op1 : tregister;_op2 : aint;_op3 : treference);
 
+         { ITxxx }
+         constructor op_cond(op: tasmop; cond: tasmcond);
+
          { *M*LL }
          constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
 
@@ -229,6 +235,10 @@ uses
         { nothing to add }
       end;
 
+      tai_thumb_func = class(tai)
+        constructor create;
+      end;
+
     function spilling_create_load(const ref:treference;r:tregister):Taicpu;
     function spilling_create_store(r:tregister; const ref:treference):Taicpu;
 
@@ -290,6 +300,19 @@ implementation
       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
 *****************************************************************************}
@@ -402,6 +425,14 @@ implementation
       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);
        begin
          inherited create(op);
@@ -574,6 +605,20 @@ implementation
             else
               { check for pre/post indexed }
               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
             internalerror(200403151);
         end;
@@ -2516,6 +2561,12 @@ static char *CC[] =
 *)
 {$endif dummy}
 
+  constructor tai_thumb_func.create;
+    begin
+      inherited create;
+      typ:=ait_thumb_func;
+    end;
+
 begin
   cai_align:=tai_align;
 end.

+ 24 - 1
compiler/arm/agarmgas.pas

@@ -38,6 +38,7 @@ unit agarmgas;
       TARMGNUAssembler=class(TGNUassembler)
         constructor create(smart: boolean); override;
         function MakeCmdLine: TCmdStr; override;
+        procedure WriteExtraHeader; override;
       end;
 
      TArmInstrWriter=class(TCPUInstrWriter)
@@ -79,6 +80,18 @@ unit agarmgas;
         result:=inherited MakeCmdLine;
         if (current_settings.fputype = fpu_soft) then
           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;
 
 {****************************************************************************}
@@ -189,6 +202,8 @@ unit agarmgas;
                   end;
               getopstr:=getopstr+'}';
             end;
+			    top_conditioncode:
+			      getopstr:=cond2str[o.cc];
           top_ref:
             if o.ref^.refaddr=addr_full then
               begin
@@ -215,7 +230,15 @@ unit agarmgas;
         sep: string[3];
     begin
       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
         begin
           sep:=#9;

+ 12 - 0
compiler/arm/aoptcpu.pas

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

+ 25 - 1
compiler/arm/armatt.inc

@@ -177,5 +177,29 @@
 'ftouid',
 'ftouis',
 '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
 );

+ 48 - 0
compiler/arm/armins.dat

@@ -573,3 +573,51 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 [FUITODcc]
 
 [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_FTOUIS,
 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)
         { true, if the next arithmetic operation should modify the flags }
         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_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;
 
         { 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_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;
         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;
@@ -103,7 +99,7 @@ unit cgcpu;
 
         procedure a_jmp_cond(list : TAsmList;cond : TOpCmp;l: tasmlabel);
         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_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;
       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)
         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;
@@ -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;
       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
       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);
@@ -131,12 +159,14 @@ unit cgcpu;
       winstackpagesize = 4096;
 
     function get_fpu_postfix(def : tdef) : toppostfix;
+    procedure create_codegen;
 
   implementation
 
 
     uses
        globals,verbose,systems,cutils,
+       aopt,aoptcpu,
        fmodule,
        symconst,symsym,
        tgobj,
@@ -164,7 +194,7 @@ unit cgcpu;
       end;
 
 
-    procedure tcgarm.init_register_allocators;
+    procedure tarmcgarm.init_register_allocators;
       begin
         inherited init_register_allocators;
         { currently, we save R14 always, so we can use it }
@@ -184,7 +214,7 @@ unit cgcpu;
       end;
 
 
-    procedure tcgarm.done_register_allocators;
+    procedure tarmcgarm.done_register_allocators;
       begin
         rg[R_INTREGISTER].free;
         rg[R_FPUREGISTER].free;
@@ -193,6 +223,174 @@ unit cgcpu;
       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);
       var
         ref: treference;
@@ -479,6 +677,17 @@ unit cgcpu;
                  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);
+                  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(
                   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;
 
 
-     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;
       var
         tmpreg : tregister;
@@ -922,138 +1088,13 @@ unit cgcpu;
        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
          oppostfix:toppostfix;
-         usedtmpref: treference;
-         tmpreg,tmpreg2 : tregister;
-         so : tshifterop;
-         dir : integer;
        begin
-         if (TCGSize2Size[FromSize] >= TCGSize2Size[ToSize]) then
-           FromSize := ToSize;
-         case FromSize of
+         case ToSize 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;
-
-
-     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:
              oppostfix:=PF_B;
            OS_16,
@@ -2108,7 +2149,7 @@ unit cgcpu;
         if weak then
           current_asmdata.weakrefasmsymbol(s);
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
-        
+
         if not(cs_create_pic in current_settings.moduleswitches) then
           begin
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$slp');
@@ -2123,7 +2164,7 @@ unit cgcpu;
           end
         else
           internalerror(2008100401);
-        
+
         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_directive.create(asd_indirect_symbol,s));
@@ -2357,7 +2398,881 @@ unit cgcpu;
       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.

+ 25 - 10
compiler/arm/cpubase.pas

@@ -503,16 +503,31 @@ unit cpubase;
       var
          i : longint;
       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;
 
 

+ 21 - 6
compiler/arm/cpuinfo.pas

@@ -34,9 +34,17 @@ Type
       (cpu_none,
        cpu_armv3,
        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 =
      (fpu_none,
       fpu_soft,
@@ -59,7 +67,10 @@ Type
       ct_at91sam7s256,
       ct_at91sam7se256,
       ct_at91sam7x256,
-      ct_at91sam7xc256
+      ct_at91sam7xc256,
+		
+      { STMicroelectronics }
+      ct_stm32f103re
      );
 
 Const
@@ -83,10 +94,12 @@ Const
      pocall_softfloat
    ];
 
-   cputypestr : array[tcputype] of string[5] = ('',
+   cputypestr : array[tcputype] of string[8] = ('',
      'ARMV3',
      'ARMV4',
-     'ARMV5'
+     'ARMV5',
+     'ARMV7M',
+     'CORTEXM3'
    );
 
    fputypestr : array[tfputype] of string[6] = ('',
@@ -106,7 +119,8 @@ Const
       'AT91SAM7S256',
       'AT91SAM7SE256',
       'AT91SAM7X256',
-      'AT91SAM7XC256'
+      'AT91SAM7XC256',
+      'STM32F103RE'
      );
 
    controllerunitstr : array[tcontrollertype] of string[20] =
@@ -117,7 +131,8 @@ Const
       'AT91SAM7x256',
       'AT91SAM7x256',
       'AT91SAM7x256',
-      'AT91SAM7x256'
+      'AT91SAM7x256',
+      'STM32F103'
      );
 
    { 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.resflags:=getresflags(unsigned);
             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));
           end
         else

+ 33 - 0
compiler/arm/raarmgas.pas

@@ -645,6 +645,32 @@ Unit raarmgas;
           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
         tempreg : tregister;
         ireg : tsuperregister;
@@ -687,6 +713,12 @@ Unit raarmgas;
           *)
           AS_ID: { A constant expression, or a Variable ref.  }
             Begin
+              { Condition code? }
+              if is_conditioncode(actasmpattern) then
+              begin
+                consume(AS_ID);
+              end
+              else
               { Local Label ? }
               if is_locallabel(actasmpattern) then
                begin
@@ -970,6 +1002,7 @@ Unit raarmgas;
           end;
         if actopcode=A_NONE then
           exit;
+			 
         { search for condition, conditions are always 2 chars }
         if length(hs)>1 then
           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;
        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)
          procedure add_cpu_interferences(p : tai);override;
        end;
@@ -157,6 +162,112 @@ unit rgcpu;
       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);
       var
         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_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
       end;
+      
+    procedure create_codegen;
 
     const
       OpCmp2AsmCond : Array[topcmp] of TAsmCond = (C_NONE,C_EQ,C_GT,
@@ -829,7 +831,10 @@ unit cgcpu;
       end;
 
 
-begin
-  cg:=tcgavr.create;
-  cg64:=tcg64favr.create;
+    procedure create_codegen;
+      begin
+        cg:=tcgavr.create;
+        cg64:=tcg64favr.create;
+      end;
+      
 end.

+ 9 - 7
compiler/cgobj.pas

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

+ 95 - 17
compiler/dbgdwarf.pas

@@ -299,6 +299,7 @@ interface
         procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
 
         function symname(sym:tsym): String; virtual;
+        procedure append_visibility(vis: tvisibility);
 
         procedure enum_membersyms_callback(p:TObject;arg:pointer);
 
@@ -1733,14 +1734,30 @@ implementation
         cc             : Tdwarf_calling_convention;
         st             : tsymtable;
         vmtindexnr     : pint;
+        incurrentunit  : boolean;
       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;
 
         { Procdefs are not handled by the regular def writing code, so
           dbg_state is not set/checked for them. Do it here.  }
         if (def.dbg_state in [dbg_state_writing,dbg_state_written]) then
           exit;
+        defnumberlist.Add(def);
 
         { Write methods and only in the scope of their parent objectdefs.  }
         if (def.owner.symtabletype=objectsymtable) then
@@ -1808,21 +1825,31 @@ implementation
             current_asmdata.asmlists[al_dwarf_info].concat(tai_const.Create_uleb128bit(vmtindexnr));
           end;
 
+        { accessibility: public/private/protected }
+        if (def.owner.symtabletype=objectsymtable) then
+          append_visibility(def.visibility);
+
         { Return type.  }
         if not(is_void(tprocdef(def).returndef)) then
           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
           localsymtable and/or parasymtable.
@@ -1843,14 +1870,17 @@ implementation
           end;
         { local type defs and vars should not be written
           inside the main proc }
-        if assigned(def.localst) and
+        if incurrentunit and
+           assigned(def.localst) and
            (def.localst.symtabletype=localsymtable) then
           write_symtable_syms(current_asmdata.asmlists[al_dwarf_info],def.localst);
 
         { last write the types from this procdef }
         if assigned(def.parast) then
           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
           begin
             write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.localst);
@@ -1999,10 +2029,17 @@ implementation
                 paravarsym,
                 localvarsym:
                   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
                 else
                   internalerror(200601288);
@@ -2022,7 +2059,23 @@ implementation
         else
           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
            ((sym.owner.symtabletype = globalsymtable) or
             (sp_static in sym.symoptions) or
@@ -2168,6 +2221,8 @@ implementation
           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_uleb128bit(fieldoffset));
+        if (sym.owner.symtabletype=objectsymtable) then
+          append_visibility(sym.visibility);
 
         append_labelentry_ref(DW_AT_type,def_dwarf_lab(def));
         finish_entry;
@@ -2176,6 +2231,14 @@ implementation
 
     procedure TDebugInfoDwarf.appendsym_const(list:TAsmList;sym:tconstsym);
       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,[
           DW_AT_name,DW_FORM_string,symname(sym)+#0
           ]);
@@ -2766,6 +2829,21 @@ implementation
       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);
       var
         currfileinfo,

+ 47 - 15
compiler/dbgstabs.pas

@@ -27,7 +27,7 @@ interface
 
     uses
       cclasses,
-      dbgbase,
+      dbgbase,cgbase,
       symtype,symdef,symsym,symtable,symbase,
       aasmtai,aasmdata;
 
@@ -74,6 +74,7 @@ interface
         procedure method_add_stabstr(p:TObject;arg:pointer);
         procedure field_write_defs(p:TObject;arg:pointer);
         function  get_enum_defstr(def: tenumdef; lowerbound: longint): ansistring;
+        function  get_appendsym_paravar_reg(sym:tparavarsym;const typ,stabstr:string;reg: tregister): ansistring;
       protected
         procedure appendsym_staticvar(list:TAsmList;sym:tstaticvarsym);override;
         procedure appendsym_paravar(list:TAsmList;sym:tparavarsym);override;
@@ -112,7 +113,7 @@ implementation
       SysUtils,cutils,cfileutl,
       systems,globals,globtype,verbose,constexp,
       symconst,defutil,
-      cpuinfo,cpubase,cgbase,paramgr,
+      cpuinfo,cpubase,paramgr,
       aasmbase,procinfo,
       finput,fmodule,ppu;
 
@@ -1276,12 +1277,30 @@ implementation
       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);
       var
         ss : ansistring;
+        c  : string[1];
         st : string;
         regidx : Tregisterindex;
-        c : char;
       begin
         ss:='';
         { set loc to LOC_REFERENCE to get somewhat usable debugging info for -Or }
@@ -1344,23 +1363,36 @@ implementation
               LOC_FPUREGISTER,
               LOC_CFPUREGISTER :
                 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;
               LOC_REFERENCE :
                 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
                     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;
               else
                 internalerror(2003091814);

+ 19 - 7
compiler/htypechk.pas

@@ -108,9 +108,9 @@ interface
         (tok:_LTE     ;nod:lten;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:_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_AND    ;nod:andn;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_XOR    ;nod:xorn;op_overloading_supported:true),    { binary 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 }
@@ -160,7 +160,7 @@ interface
 
     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);
 
@@ -421,6 +421,13 @@ implementation
                       (not is_shortstring(pf.returndef) or
                        (tstringdef(pf.returndef).len=255));
                   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
                   begin
                     for i:=1 to tok2nodes do
@@ -2605,16 +2612,21 @@ implementation
       end;
 
 
-    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions);
+    procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring);
       begin
         if not assigned(srsym) then
           internalerror(200602051);
         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
           Message1(sym_w_experimental_symbol,srsym.realname);
         if sp_hint_platform in symoptions then
           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
           Message1(sym_w_non_implemented_symbol,srsym.realname);
       end;

+ 8 - 3
compiler/i386/cgcpu.pas

@@ -63,6 +63,8 @@ unit cgcpu;
       private
         procedure get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
       end;
+      
+    procedure create_codegen;
 
   implementation
 
@@ -851,7 +853,10 @@ unit cgcpu;
         end;
       end;
 
-begin
-  cg := tcg386.create;
-  cg64 := tcg64f386.create;
+    procedure create_codegen;
+      begin
+        cg := tcg386.create;
+        cg64 := tcg64f386.create;
+      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_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO);
 
+    procedure create_codegen;
 
   implementation
 
@@ -1738,8 +1739,12 @@ unit cgcpu;
         end;
     end; { end case }
   end;
+  
+  
+procedure create_codegen;
+  begin
+    cg := tcg68k.create;
+    cg64 :=tcg64f68k.create;
+  end;
 
-begin
-  cg := tcg68k.create;
-  cg64 :=tcg64f68k.create;
 end.

+ 41 - 10
compiler/msg/errord.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <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
 #   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
 #
-# 03252 is the last used one
+# 03258 is the last used one
 #
 % \section{Parser messages}
 % 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
 % (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.
+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}
 #
 # Type Checking
 #
-# 04087 is the last used one
+# 04090 is the last used one
 #
 % \section{Type checking errors}
 % 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
 % When hints are on, then an integer division with the '/' operator will
 % 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
 % 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
@@ -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
 % in their value range (this includes enumerations whose lower bound is different
 % 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}
 #
 # Symtable
 #
-# 05064 is the last used one
+# 05066 is the last used one
 #
 % \section{Symbol handling}
 % 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
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % 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}
 #
 # Codegenerator
@@ -2057,7 +2086,7 @@ asmr_e_need_pic_ref=07107_E_Erzeuge eigentlich PIC, aber die Referenz ist nicht
 #
 # 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
 % 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
 #
-# 09200 is the last used one
+# 09201 is the last used one
 #
 # BeginOfTeX
 % \section{Linker messages}
@@ -2432,7 +2461,7 @@ unit_e_different_wpo_file=10061_E_Unit $1 wurde mit einer anderen Feedback-Einga
 #
 #  Options
 #
-# 11046 is the last used one
+# 11047 is the last used one
 #
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 # 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
 % 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.
-%\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
 % 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.
 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
 % 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
 
 #

+ 41 - 10
compiler/msg/errordu.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <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
 #   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
 #
-# 03252 is the last used one
+# 03258 is the last used one
 #
 % \section{Parser messages}
 % 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
 % (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.
+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}
 #
 # Type Checking
 #
-# 04087 is the last used one
+# 04090 is the last used one
 #
 % \section{Type checking errors}
 % 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
 % When hints are on, then an integer division with the '/' operator will
 % 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
 % 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
@@ -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
 % in their value range (this includes enumerations whose lower bound is different
 % 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}
 #
 # Symtable
 #
-# 05064 is the last used one
+# 05066 is the last used one
 #
 % \section{Symbol handling}
 % 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
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % 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}
 #
 # Codegenerator
@@ -2057,7 +2086,7 @@ asmr_e_need_pic_ref=07107_E_Erzeuge eigentlich PIC, aber die Referenz ist nicht
 #
 # 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
 % 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
 #
-# 09200 is the last used one
+# 09201 is the last used one
 #
 # BeginOfTeX
 % \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) 
 % When you use the \var{-vu} flag, the compiler warns that it is unloading the 
 % 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
 % 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
 % 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
 
 #
 #  Options
 #
-# 11046 is the last used one
+# 11047 is the last used one
 #
 option_usage=11000_O_$1 [Optionen] <Eingabedatei> [Optionen]
 # 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
 % Smart linking is currently incompatble with DWARF debug information on most
 % 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
 

+ 67 - 21
compiler/msg/errore.msg

@@ -366,7 +366,7 @@ scan_w_multiple_main_name_overrides=02086_W_Overriding name of "main" procedure
 #
 # Parser
 #
-# 03263 is the last used one
+# 03275 is the last used one
 #
 % \section{Parser messages}
 % 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
 % (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.
-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.
 % 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
 % 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
 % 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''
 % inherited ``constructors''). For these reasons, we have opted to follow the standard Objective-C patterns for
 % 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.
-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
 % 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.
 % 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.
 % Therefore, you have to explicitly define a parent class (such as NSObject) if you want to derive your
 % 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
 % 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
 % 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
 % 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
 % 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),
 % 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
 % 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.
-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
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
-%\end{description}
-
+% \end{description}
 #
 # Type Checking
 #
-# 04091 is the last used one
+# 04093 is the last used one
 #
 % \section{Type checking errors}
 % 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
 % When hints are on, then an integer division with the '/' operator will
 % 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
 % 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
@@ -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.
 type_e_string_expr_expected=04089_E_String expression expected
 % 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.
-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
 % 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
 % reference counting by the compiler (such as ansistrings and certain kinds of
 % 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}.
-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
 % \var{objcclass} types
 %
@@ -1556,7 +1583,7 @@ type_e_class_or_objcclass_type_expected=04092_E_Class or objcclass type expected
 #
 # Symtable
 #
-# 05064 is the last used one
+# 05070 is the last used one
 #
 % \section{Symbol handling}
 % 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
 % This happens if you declare a function in the \var{interface} of a unit in macpas mode,
 % 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 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

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 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_e_field_not_allowed_here=03251;
   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_incompatible_types=04001;
   type_e_not_equal_types=04002;
@@ -431,9 +443,10 @@ const
   type_e_no_type_info=04087;
   type_e_ordinal_or_string_expr_expected=04088;
   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_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
@@ -485,7 +498,12 @@ const
   sym_h_abstract_method_list=05062;
   sym_w_experimental_symbol=05063;
   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_file_must_call_by_reference=06012;
   cg_e_cant_use_far_pointer_there=06013;
@@ -808,9 +826,9 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 53113;
+  MsgTxtSize = 54143;
 
   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
   );

+ 356 - 337
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const msgtxt : array[0..000221] of string[240]=(
+const msgtxt : array[0..000225] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000221,1..240] of char=(
+const msgtxt : array[0..000225,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $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+
   '03252_E_Parameters cannot contain local type definitions. Use a separa'+
   '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+
-  '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+
-  '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+
-  '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+
-  '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+
-  '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+
-  '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+
-  '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+
-  '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+
   '04003_E_Type identifier expected'#000+
   '04004_E_Variable identifier expected'#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+
   '04008_E_pointer type expected, but got "$1"'#000+
   '04009_E_class type expected, but got "$1"'#000+
   '04011_E_Can'#039't evaluate constant expression'#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 '+
   'an integer type'#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+
   '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+
   '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+
   '04024_E_Wrong type "$1" in array constructor'#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+
   '04027_E_Illegal constant passed to internal math function'#000+
   '04028_E_Can'#039't take the address of constant expressions'#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+
   '04032_E_Can'#039't assign values to const variable'#000+
   '04033_E_Array type required'#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+
   '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+
   '04041_E_Class or interface type expected, but got "$1"'#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+
   '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+
   '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+
   '04052_E_Constant Expression expected'#000+
   '04053_E_Operation "$1" not supported for types "$2" and "$3"'#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+
   '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+
   '04061_E_Constant packed arrays are not yet supported'#000+
   '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+
   '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+
   '04064_E_Elements of packed arrays cannot be of a type which need to be'+
   ' initialised'#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+
   '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+
   '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+
   '04080_H_Converting the operands to "$1" before doing the subtract coul'+
   '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'+
   'parison results and range errors, use an unsigned type instead.'#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+
   '04087_E_No type info available for this type'#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+
-  '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+
   '05003_H_Identifier already defined in $1 at line $2'#000+
   '05004_E_Unknown identifier "$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'+
   ' methods'#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+
-  '05015_E_','Label used but not defined "$1"'#000+
+  '05015_E_Label used but not defined "$1"'#000+
   '05016_E_Illegal label declaration'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   '05018_E_Label not found'#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+
   '05023_H_Unit "$1" not used in $2'#000+
   '05024_H_Parameter "$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+
   '05029_N_Private field "$1.$2" is 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+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#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+
   '05039_H_Found declaration: $1'#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+
   '05055_W_Symbol "$1" is not implemented'#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+
-  '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+
   '05060_H_Function result variable does not seem to be initialized'#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+
-  '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+
-  '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+
   '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+
   '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+
   '06029_DL_Stack frame is omitted'#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+
-  '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'+
   '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+
   '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+
   '06045_E_CONTINUE not allowed'#000+
   '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
   '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+
   '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+
   '07002_E_Non-label pattern contains @'#000+
   '07004_E_Error building record offset'#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+
   '07009_E_need to use $ here'#000+
   '07010_E_Cannot use multiple relocatable symbols'#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+
   '07015_E_You can not reach $1 from that code'#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+
-  '07019','_E_Wrong scale factor specified'#000+
+  '07019_E_Wrong scale factor specified'#000+
   '07020_E_Multiple index register usage'#000+
   '07021_E_Invalid operand type'#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+
-  '07025_E_Divi','de by zero in asm evaluator'#000+
+  '07025_E_Divide by zero in asm evaluator'#000+
   '07026_E_Illegal expression'#000+
   '07027_E_escape sequence ignored: $1'#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+
-  '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+
   '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+
-  '07036_E_Error converting oct','al $1'#000+
+  '07036_E_Error converting octal $1'#000+
   '07037_E_Error converting binary $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07039_H_$1 translated to $2'#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+
   '07044_E_SEG not supported'#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+
   '07049_E_Assembler syntax error in operand'#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+
   '07054_E_Invalid or missing opcode'#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+
-  '07058_W_NEAR ignored',#000+
+  '07058_W_NEAR ignored'#000+
   '07059_W_FAR ignored'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07062_E_Unknown label identifier $1'#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+
-  '07067_E_Inv','alid floating point constant $1'#000+
+  '07067_E_Invalid floating point constant $1'#000+
   '07068_E_Invalid floating point expression'#000+
   '07069_E_Wrong symbol type'#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+
   '07074_No type of variable specified'#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+
-  '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+
   '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'+
   'ands'#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+
-  '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+
   '07090_E_Char > not allowed here'#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+
-  '07096_E_Reglist invalid for',' opcode'#000+
+  '07096_E_Reglist invalid for opcode'#000+
   '07097_E_Higher cpu mode required ($1)'#000+
   '07098_W_No size specified and unable to determine the size of the oper'+
   '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'+
   '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'+
   'ess'#000+
   '07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
   ' 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+
   '08000_F_Too many assembler files'#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+
-  '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+
   '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+
-  '08009_E_Asm: Invalid ef','fective address'#000+
+  '08009_E_Asm: Invalid effective address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#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+
-  '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+
   '08017_E_Asm: Redefined label $1'#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+
-  '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+
   '09001_I_Assembling (pipe) $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+
-  '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+
   '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+
-  '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+
   '09012_W_Library $1 not found, Linking may fail !'#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+
-  '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+
   '09018_E_Creation of Executables 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+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   '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+
   '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+
-  '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+
   '09032_E_Can'#039't write resource file "$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+
-  '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+
   '09133_X_Stack space reserved: $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+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10003_U_PPU Flags: $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+
-  '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+
   '10009_U_PPU is compiled for another processor'#000+
   '10010_U_PPU is compiled for an other target'#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+
   '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+
   '10017_F_PPU Dbx count problem'#000+
   '10018_E_Illegal unit name: $1'#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+
   '10023_W_Unit $1 was not found but $2 exists'#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+
   '10028_U_Recompiling $1, checksum changed for $2'#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+
   '10033_U_Recompiling unit, obj is older than asm'#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+
-  '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+
   '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+
-  '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+
   '10046_U_Implementation CRC changed for 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+
-  '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+
   '10052_U_Forced reloading'#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+
   '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+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#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+
   '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+
   '11003_E_nested response files are not supported'#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+
-  '11007_H_-? wri','tes help pages'#000+
+  '11007_H_-? writes help pages'#000+
   '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
   '11010_D_Reading further options from $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'+
   '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+
   '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+
-  '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+
   '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+
   '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+
   '11032_D_interpreting 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+
-  '11035_D_found sourc','e file name "$1"'#000+
+  '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11040_F_Config file $1 is a directory'#000+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   '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'+
   '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'+
   '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'+
   'ack file "$1"'#000+
   '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 "'+
   '$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'+
-  ' 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 '+
   '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'+
   '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 "'+
   '$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'+
   '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+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   #010+
-  'Supported targets:'#010+
+  'Supported targe','ts:'#010+
   '  $OSTARGETS'#010+
   #010+
   'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
-  #010,
+  #010+
   'Supported FPU instruction sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   #010+
@@ -959,297 +979,296 @@ const msgtxt : array[0..000221,1..240] of char=(
   'Supported Optimizations:'#010+
   '  $OPTIMIZATIONS'#010+
   #010+
-  'Supported Whole Program Optimizations:'#010+
+  'Supported Whole Program Optimizati','ons:'#010+
   '  All'#010+
   '  $WPOPTIMIZATIONS'#010+
   #010+
   'Supported Microcontroller types:'#010+
-  '  $CON','TROLLERTYPES'#010+
+  '  $CONTROLLERTYPES'#010+
   #010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   #010+
   'Report bugs, suggestions, etc. to:'#010+
-  '                 http://bugs.freepascal.org'#010+
+  '                 http://bu','gs.freepascal.org'#010+
   'or'#010+
   '                 [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+
-  '**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+
-  '*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+
   '**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+
-  '3*2Aas_Assemble using GNU AS'#010,
+  '3*2Aas_Assemble using GNU AS'#010+
   '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_ELF32 (Linux) 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*2Anasmobj_Obj file usin','g Nasm'#010+
+  '3*2Anasmobj_Obj file using Nasm'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#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+
-  '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*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amot_Standard Motorola assembler'#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+
-  '**1b_Generate',' browser info'#010+
+  '**1b_Generate browser info'#010+
   '**2bl_Generate local symbol info'#010+
   '**1B_Build all modules'#010+
   '**1C<x>_Code generation options:'#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+
-  '**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+
   '**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+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
   '**2Cn_Omit linking stage'#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+
   '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
   'and 8'#010+
-  '**2Cr_Range checking'#010+
+  '**2Cr_Range checkin','g'#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+
   '**2CX_Create also smartlinked library'#010+
   '**1d<x>_Defines the symbol <x>'#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+
-  '*O2Dw_PM applicat','ion'#010+
+  '*O2Dw_PM application'#010+
   '**1e<x>_Set path to executable'#010+
   '**1E_Same as -Cn'#010+
   '**1fPIC_Same as -Cg'#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 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<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+
-  '**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+
   '**2Fl<x>_Add <x> to library path'#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+
-  '**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+
   '**2Fu<x>_Add <x> to unit path'#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+
   '*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+
   '*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+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#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+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#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+
-  '**2iSP_Return compiler host proces','sor'#010+
+  '**2iSP_Return compiler host processor'#010+
   '**2iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#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+
-  '**2Mobjfpc_FPC mode with Object',' Pascal support'#010+
+  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 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+
-  '**2Nu_Unroll loops'#010,
+  '**2Nu_Unroll loops'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#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+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   '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'+
   '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+
   '**2Rdefault_Use default assembler for target'#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+
   '**1S<x>_Syntax options:'#010+
-  '**2S2_S','ame as -Mobjfpc'#010+
+  '**2S2_Same as -Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#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*_w : Compiler also halts after warnings'#010+
+  '**3*_w : Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#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+
   '**2Sk_Load fpcylix unit'#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+
-  '**2Sm_Support macros like C (g','lobal)'#010+
+  '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#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+
-  '**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+
   '**2sr_Skip register allocation phase (use with -alr)'#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*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*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3*2Tos2_OS/2 / eComStation'#010+
+  '3*','2Tos2_OS/2 / eComStation'#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*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '4*2Tlinux_Linux'#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*2Tmacos_Macintosh m68k (not su','pported)'#010+
+  '6*2Tmacos_Macintosh m68k (not supported)'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tdarwin_Darwin and Mac OS X 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+
   'S*2Tlinux_Linux'#010+
-  '**1u','<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Undefines the symbol <x>'#010+
   '**1U_Unit options:'#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+
-  '**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*_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*_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'+
   '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+
   '3*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+
   '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+
   '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+
   '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+
   '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+
   '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+
   '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+
-  '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+
   '3*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+
-  '**1X_Executable o','ptions:'#010+
+  '**1X_Executable options:'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
   '**2Xd_Do not use standard library search path (needed for cross compil'+
   '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+
   '**2Xi_Use internal linker'#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'+
   '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_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?_Show this help'#010+
   '**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_procvar(l,r: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 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);
           destructor destroy;override;
           constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
@@ -946,14 +946,14 @@ implementation
        end;
 
 
-     constructor tcallnode.createinternfromunit(const unitname, procname: string; params: tnode);
+     constructor tcallnode.createinternfromunit(const fromunit, procname: string; params: tnode);
        var
          srsym: tsym;
          srsymtable: tsymtable;
        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
-           Message1(cg_f_unknown_compilerproc,unitname+'.'+procname);
+           Message1(cg_f_unknown_compilerproc,fromunit+'.'+procname);
          create(params,tprocsym(srsym),srsymtable,nil,[]);
        end;
 
@@ -974,11 +974,11 @@ implementation
       end;
 
 
-    constructor tcallnode.createinternresfromunit(const unitname, procname: string; params: tnode; res:tdef);
+    constructor tcallnode.createinternresfromunit(const fromunit, procname: string; params: tnode; res:tdef);
       var
         pd : tprocdef;
       begin
-        createinternfromunit(unitname,procname,params);
+        createinternfromunit(fromunit,procname,params);
         typedef:=res;
         include(callnodeflags,cnf_typedefset);
         pd:=tprocdef(symtableprocentry.ProcdefList[0]);
@@ -2645,7 +2645,7 @@ implementation
 
           { check for hints (deprecated etc) }
           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 }
           if assigned(procdefinition) and

+ 6 - 4
compiler/ncgcon.pas

@@ -441,10 +441,12 @@ implementation
           else
             begin
               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;
           if (target_info.endian=endian_big) then
             location.value:=location.value shr (32-resultdef.size*8);

+ 1 - 1
compiler/ncgld.pas

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

+ 9 - 2
compiler/ncgutil.pas

@@ -160,7 +160,7 @@ implementation
     regvars,dbgbase,
     pass_1,pass_2,
     nbas,ncon,nld,nmem,nutils,
-    tgobj,cgobj
+    tgobj,cgobj,cgcpu
 {$ifdef powerpc}
     , cpupi
 {$endif}
@@ -2103,6 +2103,10 @@ implementation
         item := TCmdStrListItem(current_procinfo.procdef.aliasnames.first);
         while assigned(item) do
           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 }
             { directives on darwin, because otherwise the linker       }
             { sometimes strips the procedure if only on of the symbols }
@@ -2123,7 +2127,6 @@ implementation
             previtem:=item;
             item := TCmdStrListItem(item.next);
           end;
-
         current_procinfo.procdef.procstarttai:=tai(list.last);
       end;
 
@@ -2271,6 +2274,7 @@ implementation
 
     procedure gen_external_stub(list:TAsmList;pd:tprocdef;const externalname:string);
       begin
+        create_codegen;
         { add the procedure to the al_procedures }
         maybe_new_object_file(list);
         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));
 
         cg.g_external_wrapper(list,pd,externalname);
+        destroy_codegen;
       end;
 
 {****************************************************************************
@@ -2811,12 +2816,14 @@ implementation
         i   : longint;
         def : tdef;
       begin
+        create_codegen;
         for i:=0 to st.DefList.Count-1 do
           begin
             def:=tdef(st.DefList[i]);
             if is_class(def) then
               gen_intf_wrapper(list,tobjectdef(def));
           end;
+        destroy_codegen;
       end;
 
 

+ 18 - 14
compiler/ncnv.pas

@@ -786,9 +786,6 @@ implementation
 
     function ttypeconvnode.typecheck_cord_to_pointer : tnode;
 
-      var
-        t : tnode;
-
       begin
         result:=nil;
         if left.nodetype=ordconstn then
@@ -807,8 +804,14 @@ implementation
                 internalerror(2001020801);
               {$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
          else
           internalerror(200104023);
@@ -1700,12 +1703,8 @@ implementation
               te_convert_l3,
               te_convert_l4,
               te_convert_l5:
-                begin
-                  result := simplify;
-                  if assigned(result) then
-                    exit;
-                  { nothing to do }
-                end;
+                { nothing to do }
+                ;
 
               te_convert_operator :
                 begin
@@ -1919,9 +1918,14 @@ implementation
               CGMessage(type_w_pointer_to_longint_conv_not_portable);
           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 }
         result:=typecheck_call_helper(convtype);

+ 24 - 3
compiler/ncon.pas

@@ -192,6 +192,7 @@ interface
     { some helper routines }
     function get_ordinal_value(p : tnode) : TConstExprInt;
     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_emptyset(p : tnode):boolean;
     function genconstsymtree(p : tconstsym) : tnode;
@@ -254,11 +255,12 @@ implementation
                 if (not is_wide) then
                   begin
                     if ordValRecord.signed then
-                      stringVal := char(ordValRecord.svalue) + ''#0
+                      stringVal := char(ordValRecord.svalue)
                     else
-                      stringVal := char(ordValRecord.uvalue) + ''#0;
-                    getmem(pCharVal, length(stringVal));
+                      stringVal := char(ordValRecord.uvalue);
+                    getmem(pCharVal, length(stringVal) + 1);
                     strpcopy(pCharVal, stringVal);
+                    pCharVal[length(stringVal)] := #0;
                     get_string_value := pCharVal;
                   end
                 else
@@ -317,6 +319,25 @@ implementation
           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;
       begin
         is_constresourcestringnode:=(p.nodetype=loadn) and

+ 391 - 5
compiler/nflw.pas

@@ -216,17 +216,22 @@ interface
        ctryfinallynode : ttryfinallynodeclass;
        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
 
     uses
       globtype,systems,constexp,
       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}
       nstate,
     {$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
 *****************************************************************************}

+ 4 - 2
compiler/ninl.pas

@@ -1122,7 +1122,7 @@ implementation
         { check if codepara is valid }
         if assigned(codepara) and
            (
-            (codepara.resultdef.typ <> orddef)
+            not is_integer(codepara.resultdef)
 {$ifndef cpu64bitaddr}
             or is_64bitint(codepara.resultdef)
 {$endif not cpu64bitaddr}
@@ -1133,7 +1133,9 @@ implementation
           end;
 
         { 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
             CGMessagePos(destpara.fileinfo,type_e_integer_or_real_expr_expected);
             exit;

+ 14 - 12
compiler/nobj.pas

@@ -271,6 +271,11 @@ implementation
             { compare parameter types only, no specifiers yet }
             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
               new definition has no virtual or override }
             if (po_virtualmethod in vmtpd.procoptions) and
@@ -527,7 +532,7 @@ implementation
         timpls    = array[0..1000] of longint;
         pimpls    = ^timpls;
       var
-        equals: pequals;
+        aequals: pequals;
         compats: pcompintfs;
         impls: pimpls;
         ImplIntfCount,
@@ -541,10 +546,10 @@ implementation
         if ImplIntfCount>=High(tequals) then
           Internalerror(200006135);
         getmem(compats,sizeof(tcompintfentry)*ImplIntfCount);
-        getmem(equals,sizeof(longint)*ImplIntfCount);
+        getmem(aequals,sizeof(longint)*ImplIntfCount);
         getmem(impls,sizeof(longint)*ImplIntfCount);
         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));
         { ismergepossible is a containing relation
           meaning of ismergepossible(a,b,w) =
@@ -563,8 +568,8 @@ implementation
                 if cij and cji then { i equal j }
                   begin
                     { get minimum index of equal }
-                    if equals^[j]=-1 then
-                      equals^[j]:=i;
+                    if aequals^[j]=-1 then
+                      aequals^[j]:=i;
                   end
                 else if cij then
                   begin
@@ -601,8 +606,8 @@ implementation
             begin
               if compats^[impls^[i]].compintf<>-1 then
                 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
                 inc(k);
             end;
@@ -614,7 +619,7 @@ implementation
             ImplIntfI.VtblImplIntf:=TImplementedInterface(_class.ImplementedInterfaces[impls^[i]]);
           end;
         freemem(compats);
-        freemem(equals);
+        freemem(aequals);
         freemem(impls);
       end;
 
@@ -1452,10 +1457,7 @@ implementation
             { pointer to field table }
             current_asmdata.asmlists[al_globals].concat(Tai_const.Create_sym(fieldtablelabel));
             { 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 }
             if _class.members_need_inittable then
               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(
                 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
                   condit.nodetype := gten;
                   condit := caddnode.create(
@@ -791,10 +791,17 @@ implementation
          init_block:=nil;
          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. }
          { No need to do this for ordinal, because }
          { 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
              init_block := internalstatements(stmt);
              tempcaseexpr :=
@@ -811,12 +818,6 @@ implementation
              typecheckpass(left);
            end;
 
-         { evalutes the case expression }
-         firstpass(left);
-         set_varstate(left,vs_read,[vsf_must_be_valid]);
-         if codegenerror then
-           exit;
-
          { first case }
          for i:=0 to blocks.count-1 do
            firstpass(pcaseblock(blocks[i])^.statement);
@@ -1065,7 +1066,7 @@ implementation
           if (str_type in [cst_widestring, cst_unicodestring]) then
             result := comparewidestrings(pcompilerwidestring(l), pcompilerwidestring(h))
           else
-            result := strcomp(l, h);
+            result := compare_strings(l, h);
         end;
 
       var

+ 24 - 0
compiler/nutils.pas

@@ -86,6 +86,7 @@ interface
       containing no code }
     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);
     function node_to_propaccesslist(p1:tnode):tpropaccesslist;
 
@@ -344,6 +345,10 @@ implementation
       var
         pd : tprocdef;
       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
           symtablestack is not fully setup when pass1
           is run for nested procedures }
@@ -924,6 +929,25 @@ implementation
       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);
       var
         plist : ppropaccesslistitem;

+ 1 - 2
compiler/options.pas

@@ -82,8 +82,7 @@ uses
   comphook,
   symtable,scanner,rabase,
   wpobase,
-  i_bsd
-  ;
+  i_bsd;
 
 const
   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_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) }
     var
@@ -194,7 +194,7 @@ implementation
         try_consume_unitsym(srsym,srsymtable,t);
         { if nothing found give error and return errorsym }
         if assigned(srsym) then
-          check_hints(srsym,srsym.symoptions)
+          check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
         else
           begin
             identifier_not_found(orgpattern);
@@ -227,7 +227,7 @@ implementation
         try_consume_unitsym(srsym,srsymtable,t);
         { if nothing found give error and return errorsym }
         if assigned(srsym) then
-          check_hints(srsym,srsym.symoptions)
+          check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
         else
           begin
             identifier_not_found(orgpattern);
@@ -282,12 +282,15 @@ implementation
       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
         try_consume_hintdirective:=false;
         if not(m_hintdirective in current_settings.modeswitches) then
          exit;
         repeat
+          last_is_deprecated:=false;
           case idtoken of
             _LIBRARY :
               begin
@@ -298,6 +301,7 @@ implementation
               begin
                 include(symopt,sp_hint_deprecated);
                 try_consume_hintdirective:=true;
+                last_is_deprecated:=true;
               end;
             _EXPERIMENTAL :
               begin
@@ -318,6 +322,15 @@ implementation
               break;
           end;
           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;
       end;
 

+ 21 - 12
compiler/pdecl.pas

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

+ 60 - 4
compiler/pdecobj.pas

@@ -108,9 +108,34 @@ implementation
               end;
             consume(_SEMICOLON);
           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,
           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);
       end;
 
@@ -257,6 +282,24 @@ implementation
         p.free;
       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;
       var
@@ -299,7 +342,10 @@ implementation
                             end
                           else
                             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_interfacecom:
                      begin
@@ -450,12 +496,19 @@ implementation
         procedure maybe_parse_hint_directives(pd:tprocdef);
         var
           dummysymoptions : tsymoptions;
+          deprecatedmsg : pshortstring;
         begin
           dummysymoptions:=[];
-          while try_consume_hintdirective(dummysymoptions) do
+          deprecatedmsg:=nil;
+          while try_consume_hintdirective(dummysymoptions,deprecatedmsg) do
             Consume(_SEMICOLON);
           if assigned(pd) then
-            pd.symoptions:=pd.symoptions+dummysymoptions;
+            begin
+              pd.symoptions:=pd.symoptions+dummysymoptions;
+              pd.deprecatedmsg:=deprecatedmsg;
+            end
+          else
+            stringdispose(deprecatedmsg);
         end;
 
       var
@@ -821,6 +874,9 @@ implementation
           end
         else
           begin
+            { parse list of options (abstract / sealed) }
+            parse_object_options;
+
             { parse list of parent classes }
             parse_parent_classes;
 

+ 88 - 7
compiler/pdecsub.pas

@@ -423,10 +423,11 @@ implementation
         old_block_type : tblock_type;
         currparast : tparasymtable;
         parseprocvar : tppv;
-        explicit_paraloc : boolean;
         locationstr : string;
         paranr : integer;
         dummytype : ttypesym;
+        explicit_paraloc,
+        need_array: boolean;
       begin
         old_block_type:=block_type;
         explicit_paraloc:=false;
@@ -525,7 +526,16 @@ implementation
            begin
              consume(_COLON);
              { 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
                 consume(_ARRAY);
                 consume(_OF);
@@ -1089,17 +1099,22 @@ implementation
                end
               else
                begin
+                 { Use the dummy NOTOKEN that is also declared
+                   for the overloaded_operator[] }
+                 optoken:=NOTOKEN;
                  case token of
                    _CARET:
                      Message1(parser_e_overload_operator_failed,'**');
+                   _ID:
+                     if idtoken = _ENUMERATOR then
+                       optoken := _OP_ENUMERATOR
+                     else
+                       Message1(parser_e_overload_operator_failed,'');
                    _UNEQUAL:
                      Message1(parser_e_overload_operator_failed,'=');
                    else
                      Message1(parser_e_overload_operator_failed,'');
                  end;
-                 { Use the dummy NOTOKEN that is also declared
-                   for the overloaded_operator[] }
-                 optoken:=NOTOKEN;
                end;
               consume(token);
               parse_proc_head(aclass,potype_operator,pd);
@@ -1284,6 +1299,9 @@ procedure pd_abstract(pd:tabstractprocdef);
 begin
   if pd.typ<>procdef then
     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
     include(pd.procoptions,po_abstractmethod)
   else
@@ -1292,6 +1310,44 @@ begin
   tprocdef(pd).forwarddef:=false;
 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);
 {$ifdef WITHDMT}
 var
@@ -1376,6 +1432,8 @@ begin
   if not is_class(tprocdef(pd)._class) and
      not is_objc_class_or_protocol(tprocdef(pd)._class) then
     Message(parser_e_msg_only_for_classes);
+  if ([po_msgstr,po_msgint]*pd.procoptions)<>[] then
+    Message(parser_e_multiple_messages);
   { check parameter type }
   if not is_objc_class_or_protocol(tprocdef(pd)._class) then
     begin
@@ -1424,7 +1482,7 @@ procedure pd_reintroduce(pd:tabstractprocdef);
 begin
   if pd.typ<>procdef then
     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);
 end;
 
@@ -1700,7 +1758,7 @@ type
    end;
 const
   {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=
    (
     (
@@ -1812,6 +1870,15 @@ const
       mutexclpocall : [];
       mutexclpotype : [];
       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;
       pd_flags : [pd_implemen,pd_notobject,pd_notobjintf];
@@ -2075,6 +2142,15 @@ const
       { allowed for external cpp classes }
       mutexclpotype : [{potype_constructor,potype_destructor}];
       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;
                    if assigned(fwpd.funcretsym) then
                      fwpd.funcretsym.fileinfo:=currpd.fileinfo;
+                   if assigned(currpd.deprecatedmsg) then
+                     begin
+                       stringdispose(fwpd.deprecatedmsg);
+                       fwpd.deprecatedmsg:=stringdup(currpd.deprecatedmsg^);
+                     end;
                    { import names }
                    if assigned(currpd.import_dll) then
                      begin

+ 15 - 2
compiler/pdecvar.pas

@@ -88,6 +88,9 @@ implementation
                  searchsym(pattern,sym,srsymtable);
                if assigned(sym) then
                 begin
+                  if assigned(aclass) and
+                     not is_visible_for_object(sym,aclass) then
+                    Message(parser_e_cant_access_private_member);
                   case sym.typ of
                     fieldvarsym :
                       begin
@@ -1137,6 +1140,7 @@ implementation
          allowdefaultvalue,
          hasdefaultvalue : boolean;
          hintsymoptions  : tsymoptions;
+         deprecatedmsg   : pshortstring;
          old_block_type  : tblock_type;
       begin
          old_block_type:=block_type;
@@ -1214,12 +1218,16 @@ implementation
 
              { try to parse the hint directives }
              hintsymoptions:=[];
-             try_consume_hintdirective(hintsymoptions);
+             deprecatedmsg:=nil;
+             try_consume_hintdirective(hintsymoptions,deprecatedmsg);
              for i:=0 to sc.count-1 do
                begin
                  vs:=tabstractvarsym(sc[i]);
                  vs.symoptions := vs.symoptions + hintsymoptions;
+                 if deprecatedmsg<>nil then
+                   vs.deprecatedmsg:=stringdup(deprecatedmsg^);
                end;
+             stringdispose(deprecatedmsg);
 
              { Handling of Delphi typed const = initialized vars }
              if allowdefaultvalue and
@@ -1315,6 +1323,7 @@ implementation
          offset : longint;
          uniondef : trecorddef;
          hintsymoptions : tsymoptions;
+         deprecatedmsg : pshortstring;
          semicoloneaten: boolean;
          is_first_field: boolean;
 {$if defined(powerpc) or defined(powerpc64)}
@@ -1402,7 +1411,8 @@ implementation
 
              { try to parse the hint directives }
              hintsymoptions:=[];
-             try_consume_hintdirective(hintsymoptions);
+             deprecatedmsg:=nil;
+             try_consume_hintdirective(hintsymoptions,deprecatedmsg);
 
              { mark first field }
              if (is_first_field) then
@@ -1418,7 +1428,10 @@ implementation
                  fieldvs.vardef:=hdef;
                  { insert any additional hint directives }
                  fieldvs.symoptions := fieldvs.symoptions + hintsymoptions;
+                 if deprecatedmsg<>nil then
+                   fieldvs.deprecatedmsg:=stringdup(deprecatedmsg^);
                end;
+               stringdispose(deprecatedmsg);
 
              { Records and objects can't have default values }
              { 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;
          callflags  : tcallnodeflags;
          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
          { property parameters? read them only if the property really }
          { has parameters                                             }
@@ -1069,7 +1050,7 @@ implementation
          { if not(afterassignment) and not(in_args) then }
          if token=_ASSIGNMENT then
            begin
-              if getpropaccesslist(palt_write) then
+              if getpropaccesslist(propsym,palt_write,propaccesslist) then
                 begin
                    case propaccesslist.firstsym^.sym.typ of
                      procsym :
@@ -1119,7 +1100,7 @@ implementation
            end
          else
            begin
-              if getpropaccesslist(palt_read) then
+              if getpropaccesslist(propsym,palt_read,propaccesslist) then
                 begin
                    case propaccesslist.firstsym^.sym.typ of
                      fieldvarsym :
@@ -1212,7 +1193,7 @@ implementation
                           static_name:=lower(sym.owner.name^)+'_'+sym.name;
                           searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable);
                           if assigned(sym) then
-                            check_hints(sym,sym.symoptions);
+                            check_hints(sym,sym.symoptions,sym.deprecatedmsg);
                           p1.free;
                           p1:=nil;
                           { static syms are always stored as absolutevarsym to handle scope and storage properly }
@@ -1338,7 +1319,7 @@ implementation
                   end;
                { if nothing found give error and return errorsym }
                if assigned(srsym) then
-                 check_hints(srsym,srsym.symoptions)
+                 check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg)
                else
                  begin
                    identifier_not_found(orgstoredpattern);
@@ -1457,7 +1438,7 @@ implementation
                                  { search also in inherited methods }
                                  searchsym_in_class(tobjectdef(hdef),current_objectdef,pattern,srsym,srsymtable);
                                  if assigned(srsym) then
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                  consume(_ID);
                                  do_member_read(tobjectdef(hdef),false,srsym,p1,again,[]);
                                end
@@ -1477,7 +1458,7 @@ implementation
                               srsym:=search_class_member(tobjectdef(hdef),pattern);
                               if assigned(srsym) then
                                 begin
-                                  check_hints(srsym,srsym.symoptions);
+                                  check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                   if not(getaddr) and not(sp_static in srsym.symoptions) then
                                     Message(sym_e_only_static_in_static)
                                   else
@@ -1507,7 +1488,7 @@ implementation
                                 srsym:=search_class_member(tobjectdef(hdef),pattern);
                                 if assigned(srsym) then
                                  begin
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                    consume(_ID);
                                    do_member_read(tobjectdef(hdef),getaddr,srsym,p1,again,[]);
                                  end
@@ -2007,7 +1988,7 @@ implementation
                               if assigned(srsym) and
                                  (srsym.typ=fieldvarsym) then
                                 begin
-                                  check_hints(srsym,srsym.symoptions);
+                                  check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                   p1:=csubscriptnode.create(srsym,p1)
                                 end
                               else
@@ -2063,7 +2044,7 @@ implementation
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                if assigned(srsym) then
                                  begin
-                                   check_hints(srsym,srsym.symoptions);
+                                   check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                    consume(_ID);
                                    do_member_read(classh,getaddr,srsym,p1,again,[]);
                                  end
@@ -2087,7 +2068,7 @@ implementation
                                searchsym_in_class(classh,classh,pattern,srsym,srsymtable);
                                if assigned(srsym) then
                                  begin
-                                    check_hints(srsym,srsym.symoptions);
+                                    check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                                     consume(_ID);
                                     do_member_read(classh,getaddr,srsym,p1,again,[]);
                                  end
@@ -2280,7 +2261,7 @@ implementation
                      end;
                     if assigned(srsym) then
                      begin
-                       check_hints(srsym,srsym.symoptions);
+                       check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                        { load the procdef from the inherited class and
                          not from self }
                        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;
      end;
 
+  procedure create_codegen;
 
 const
   TOpCG2AsmOpConstLo: Array[topcg] of TAsmOp = (A_NONE,A_MR,A_ADDI,A_ANDI_,A_DIVWU,
@@ -1870,7 +1871,10 @@ const
       end;
 
 
-begin
-  cg := tcgppc.create;
-  cg64 :=tcg64fppc.create;
+    procedure create_codegen;
+      begin
+        cg := tcgppc.create;
+        cg64 :=tcg64fppc.create;
+      end;
+      
 end.

+ 6 - 0
compiler/powerpc64/cgcpu.pas

@@ -140,6 +140,8 @@ type
     procedure profilecode_savepara(para : tparavarsym; list : TAsmList);
     procedure profilecode_restorepara(para : tparavarsym; list : TAsmList);
   end;
+  
+  procedure create_codegen;
 
 const
   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);
 end;
 
+
+procedure create_codegen;
 begin
   cg := tcgppc.create;
+end;
+
 end.

+ 186 - 136
compiler/pstatmnt.pas

@@ -183,8 +183,8 @@ implementation
                end;
              hl1:=0;
              hl2:=0;
-             sl1:='';
-             sl2:='';
+             sl1:=nil;
+             sl2:=nil;
              if (p.nodetype=rangen) then
                begin
                  { type check for string case statements }
@@ -197,7 +197,7 @@ implementation
                    if (
                      (is_wide_or_unicode_string(casedef) and (
                        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);
                  end
                  { type checking for ordinal case statements }
@@ -245,6 +245,29 @@ implementation
                    end;
                end;
              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
                consume(_COMMA)
              else
@@ -340,150 +363,177 @@ implementation
 {$endif not cpu64bitaddr}
         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
-                  { 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
-         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;
 
 

+ 6 - 3
compiler/psub.pas

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

+ 3 - 0
compiler/psystem.pas

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

+ 1 - 1
compiler/ptconst.pas

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

+ 3 - 0
compiler/rautils.pas

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

+ 16 - 1
compiler/scanner.pas

@@ -391,6 +391,14 @@ implementation
            if (cs_support_exceptions in current_settings.globalswitches) then
              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 }
             if (m_delphi in oldmodeswitches) then
               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
                   begin
                     readnumber;
-                    token:=_INTCONST;
+                    if length(pattern)=1 then
+                      begin
+                        readstring;
+                        token:=_ID;
+                        idtoken:=_ID;
+                      end
+                    else
+                      token:=_INTCONST;
                     goto exit_label;
                   end
                  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_reg_reg_reg_checkoverflow(list: TAsmList;op:TOpCG;size : tcgsize;regsrc1,regsrc2,regdst : tregister64;setflags : boolean;var ovloc : tlocation);override;
       end;
+      
+    procedure create_codegen;
 
     const
       TOpCG2AsmOp : array[topcg] of TAsmOp=(
@@ -1535,7 +1537,10 @@ implementation
       end;
 
 
-begin
-  cg:=TCgSparc.Create;
-  cg64:=TCg64Sparc.Create;
+    procedure create_codegen;
+      begin
+        cg:=TCgSparc.Create;
+        cg64:=TCg64Sparc.Create;
+      end;
+      
 end.

+ 12 - 3
compiler/symconst.pas

@@ -151,7 +151,8 @@ type
     sp_internal,  { internal symbol, not reported as unused }
     sp_implicitrename,
     sp_hint_experimental,
-    sp_generic_para
+    sp_generic_para,
+    sp_has_deprecated_msg
   );
   tsymoptions=set of tsymoption;
 
@@ -231,6 +232,7 @@ type
     po_classmethod,       { class method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_abstractmethod,    { Procedure is an abstract method }
+    po_finalmethod,       { Procedure is a final method }
     po_staticmethod,      { static method }
     po_overridingmethod,  { method with override directive }
     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) }
     po_weakexternal,
     { Objective-C method }
-    po_objc
+    po_objc,
+    { enumerator support }
+    po_enumerator_movenext
   );
   tprocoptions=set of tprocoption;
 
@@ -311,6 +315,8 @@ type
   { options for objects and classes }
   tobjectoption=(oo_none,
     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_private,
     oo_has_protected,
@@ -324,6 +330,8 @@ type
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_has_default_property,
     oo_has_valid_guid,
+    oo_has_enumerator_movenext,
+    oo_has_enumerator_current,
     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;) }
   );
@@ -346,7 +354,8 @@ type
     ppo_defaultproperty,
     ppo_stored,
     ppo_hasparameters,
-    ppo_implements
+    ppo_implements,
+    ppo_enumerator_current
   );
   tpropertyoptions=set of tpropertyoption;
 

+ 132 - 1
compiler/symdef.pas

@@ -299,6 +299,10 @@ interface
           function FindDestructor : tprocdef;
           function implements_any_interfaces: boolean;
           procedure reset; override;
+          { enumerator support }
+          function search_enumerator_get: tprocdef;
+          function search_enumerator_move: tprocdef;
+          function search_enumerator_current: tsym;
           { WPO }
           procedure register_created_object_type;override;
           procedure register_maybe_created_object_type;
@@ -470,6 +474,7 @@ interface
 {$endif}
           visibility : tvisibility;
           symoptions : tsymoptions;
+          deprecatedmsg : pshortstring;
           { symbol owning this definition }
           procsym : tsym;
           procsymderef : tderef;
@@ -2803,7 +2808,7 @@ implementation
            begin
              b:=ppufile.getbyte;
              if b<>sizeof(funcretloc[callerside]) then
-               internalerror(200411154);
+               internalerror(200411155);
              ppufile.getdata(funcretloc[callerside],sizeof(funcretloc[callerside]));
            end;
 
@@ -2966,6 +2971,7 @@ implementation
          import_name:=nil;
          import_nr:=0;
          inlininginfo:=nil;
+         deprecatedmsg:=nil;
 {$ifdef i386}
           fpu_used:=maxfpuregs;
 {$endif i386}
@@ -2990,6 +2996,10 @@ implementation
          visibility:=tvisibility(ppufile.getbyte);
          ppufile.getsmallset(symoptions);
          optional:=boolean(ppufile.getbyte);
+         if sp_has_deprecated_msg in symoptions then
+           deprecatedmsg:=stringdup(ppufile.getstring)
+         else
+           deprecatedmsg:=nil;
 {$ifdef powerpc}
          { library symbol for AmigaOS/MorphOS }
          ppufile.getderef(libsymderef);
@@ -3090,6 +3100,7 @@ implementation
          stringdispose(resultname);
          stringdispose(import_dll);
          stringdispose(import_name);
+         stringdispose(deprecatedmsg);
          if (po_msgstr in procoptions) then
            stringdispose(messageinf.str);
          if assigned(_mangledname) then
@@ -3128,6 +3139,8 @@ implementation
          ppufile.putbyte(byte(visibility));
          ppufile.putsmallset(symoptions);
          ppufile.putbyte(byte(optional));
+         if sp_has_deprecated_msg in symoptions then
+           ppufile.putstring(deprecatedmsg^);
 {$ifdef powerpc}
          { library symbol for AmigaOS/MorphOS }
          ppufile.putderef(libsymderef);
@@ -4418,6 +4431,119 @@ implementation
         classref_created_in_current_module:=false;
       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;
       begin
@@ -4681,6 +4807,11 @@ implementation
     function TImplementedInterface.getcopy:TImplementedInterface;
       begin
         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);
       end;
 

+ 94 - 3
compiler/symsym.pas

@@ -79,6 +79,8 @@ interface
           constructor create;
        end;
 
+       { tprocsym }
+
        tprocsym = class(tstoredsym)
        protected
           FProcdefList   : TFPObjectList;
@@ -97,8 +99,10 @@ interface
           procedure deref;override;
           function find_procdef_bytype(pt:Tproctypeoption):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_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;
        end;
 
@@ -362,6 +366,10 @@ implementation
          ppufile.getposinfo(fileinfo);
          visibility:=tvisibility(ppufile.getbyte);
          ppufile.getsmallset(symoptions);
+         if sp_has_deprecated_msg in symoptions then
+           deprecatedmsg:=stringdup(ppufile.getstring)
+         else
+           deprecatedmsg:=nil;
       end;
 
 
@@ -372,6 +380,8 @@ implementation
          ppufile.putposinfo(fileinfo);
          ppufile.putbyte(byte(visibility));
          ppufile.putsmallset(symoptions);
+         if sp_has_deprecated_msg in symoptions then
+           ppufile.putstring(deprecatedmsg^);
       end;
 
 
@@ -651,6 +661,22 @@ implementation
           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;
       var
@@ -688,8 +714,8 @@ implementation
 
     function Tprocsym.Find_procdef_assignment_operator(fromdef,todef:tdef;var besteq:tequaltype):Tprocdef;
       var
-        paraidx,
-        i  : longint;
+        paraidx, realparamcount,
+        i, j : longint;
         bestpd,
         hpd,
         pd : tprocdef;
@@ -723,8 +749,13 @@ implementation
                       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]) then
+                   assigned(pd.paras[paraidx]) and
+                   (realparamcount = 1) then
                   begin
                     eq:=compare_defs_ext(fromdef,tparavarsym(pd.paras[paraidx]).vardef,nothingn,convtyp,hpd,[]);
 
@@ -753,6 +784,66 @@ implementation
         result:=bestpd;
       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

+ 40 - 2
compiler/symtable.pas

@@ -203,6 +203,7 @@ interface
     function  search_named_unit_globaltype(const unitname, typename: TIDString): ttypesym;
     function  search_class_member(pd : tobjectdef;const s : string):tsym;
     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, }
     {and returns it if found. Returns nil otherwise.}
     function  search_macro(const s : string):tsym;
@@ -256,7 +257,7 @@ interface
           'sym_diff','starstar',
           'as','is','in','or',
           'and','div','mod','not','shl','shr','xor',
-          'assign');
+          'assign','enumerator');
 
 
 
@@ -1940,6 +1941,44 @@ implementation
       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;
       var
         sym : tsym;
@@ -1994,7 +2033,6 @@ implementation
         search_class_member:=nil;
       end;
 
-
     function search_macro(const s : string):tsym;
       var
         stackitem  : psymtablestackitem;

+ 4 - 0
compiler/symtype.pas

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

+ 1 - 1
compiler/systems/i_linux.pas

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

+ 11 - 0
compiler/systems/t_embed.pas

@@ -245,6 +245,17 @@ begin
           Add('}');
           Add('_stack_top = 0x20FFFC;');
         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
       internalerror(200902011);

+ 9 - 1
compiler/tokens.pas

@@ -53,6 +53,7 @@ type
     _OP_SHR,
     _OP_XOR,
     _ASSIGNMENT,
+    _OP_ENUMERATOR,
     { special chars }
     _CARET,
     _UNEQUAL,
@@ -149,6 +150,7 @@ type
     _CONST,
     _FALSE,
     _FAR16,
+    _FINAL,
     _INDEX,
     _LABEL,
     _LOCAL,
@@ -170,6 +172,7 @@ type
     _REPEAT,
     _RESULT,
     _RETURN,
+    _SEALED,
     _STATIC,
     _STORED,
     _STRICT,
@@ -233,6 +236,7 @@ type
     _WRITEONLY,
     _DEPRECATED,
     _DESTRUCTOR,
+    _ENUMERATOR,
     _IMPLEMENTS,
     _INTERNPROC,
     _OLDFPCCALL,
@@ -262,7 +266,7 @@ const
   { last operator which can be overloaded, the first_overloaded should
     be declared directly after NOTOKEN }
   first_overloaded = succ(NOTOKEN);
-  last_overloaded  = _ASSIGNMENT;
+  last_overloaded  = _OP_ENUMERATOR;
 
 type
   tokenrec=record
@@ -309,6 +313,7 @@ const
       (str:'shr'           ;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:'enumerator'    ;special:true ;keyword:m_none;op:NOTOKEN),
     { Special chars }
       (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:'FALSE'         ;special:false;keyword:m_all;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:'LABEL'         ;special:false;keyword:m_all;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:'RESULT'        ;special:false;keyword:m_none;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:'STORED'        ;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:'DEPRECATED'    ;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:'INTERNPROC'    ;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;
 
 
-procedure readsymoptions;
+procedure readsymoptions(space : string);
 type
   { symbol options }
   tsymoption=(sp_none,
@@ -757,7 +757,8 @@ type
     sp_has_overloaded,
     sp_internal,  { internal symbol, not reported as unused }
     sp_implicitrename,
-    sp_generic_para
+    sp_generic_para,
+    sp_has_deprecated_msg
   );
   tsymoptions=set of tsymoption;
   tsymopt=record
@@ -765,18 +766,19 @@ type
     str  : string[30];
   end;
 const
-  symopts=10;
+  symopts=11;
   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
   symoptions : tsymoptions;
@@ -798,6 +800,8 @@ begin
        end;
    end;
   writeln;
+  if sp_has_deprecated_msg in symoptions then
+    writeln(space,'Deprecated : ', ppufile.getstring);
 end;
 
 
@@ -809,7 +813,7 @@ begin
   readposinfo;
   writeln(space,'   Visibility : ',Visibility2Str(ppufile.getbyte));
   write  (space,'   SymOptions : ');
-  readsymoptions;
+  readsymoptions(space+'   ');
 end;
 
 
@@ -1074,6 +1078,7 @@ type
     po_classmethod,       { class method }
     po_virtualmethod,     { Procedure is a virtual method }
     po_abstractmethod,    { Procedure is an abstract method }
+    po_finalmethod,       { Procedure is a final method }
     po_staticmethod,      { static method }
     po_overridingmethod,  { method with override directive }
     po_methodpointer,     { method pointer, only in procvardef, also used for 'with object do' }
@@ -1122,7 +1127,9 @@ type
     po_kylixlocal,
     po_dispid,
     { 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;
 
@@ -1169,6 +1176,7 @@ const
      (mask:po_classmethod;     str:'ClassMethod'),
      (mask:po_virtualmethod;   str:'VirtualMethod'),
      (mask:po_abstractmethod;  str:'AbstractMethod'),
+     (mask:po_finalmethod;     str:'FinalMethod'),
      (mask:po_staticmethod;    str:'StaticMethod'),
      (mask:po_overridingmethod;str:'OverridingMethod'),
      (mask:po_methodpointer;   str:'MethodPointer'),
@@ -1205,7 +1213,9 @@ const
      (mask:po_has_importname;  str:'HasImportName'),
      (mask:po_kylixlocal;      str:'KylixLocal'),
      (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
   proctypeoption  : tproctypeoption;
@@ -1354,6 +1364,8 @@ procedure readobjectdefoptions;
 type
   tobjectoption=(oo_none,
     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_private,
     oo_has_protected,
@@ -1366,7 +1378,9 @@ type
     oo_has_msgint,
     oo_can_have_published,{ the class has rtti, i.e. you can publish properties }
     oo_has_default_property,
-    oo_has_valid_guid
+    oo_has_valid_guid,
+    oo_has_enumerator_movenext,
+    oo_has_enumerator_current
   );
   tobjectoptions=set of tobjectoption;
   tsymopt=record
@@ -1376,6 +1390,8 @@ type
 const
   symopt : array[1..ord(high(tobjectoption))] of tsymopt=(
      (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_private;        str:'HasPrivate'),
      (mask:oo_has_protected;      str:'HasProtected'),
@@ -1388,7 +1404,9 @@ const
      (mask:oo_has_msgint;         str:'HasMsgInt'),
      (mask:oo_can_have_published; str:'CanHavePublished'),
      (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
   symoptions : tobjectoptions;
@@ -1860,7 +1878,7 @@ begin
              readposinfo;
              writeln(space,'       Visibility : ',Visibility2Str(ppufile.getbyte));
              write  (space,'       SymOptions : ');
-             readsymoptions;
+             readsymoptions(space+'       ');
              if tsystemcpu(ppufile.header.cpu)=cpu_powerpc then
                begin
                  { library symbol for AmigaOS/MorphOS }

+ 7 - 2
compiler/x86/cgx86.pas

@@ -351,6 +351,11 @@ unit cgx86;
         add_hreg: boolean;
 {$endif not  x86_64}
       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}
         { Only 32bit is allowed }
         if ((ref.offset<low(longint)) or (ref.offset>high(longint))) then
@@ -397,7 +402,7 @@ unit cgx86;
                     if (ref.base<>NR_NO) or
                        (ref.index<>NR_NO) then
                       begin
-                        reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+                        reference_reset_symbol(href,ref.symbol,0,ref.alignment);
                         hreg:=getaddressregister(list);
                         href.refaddr:=addr_pic_no_got;
                         href.base:=NR_RIP;
@@ -413,7 +418,7 @@ unit cgx86;
                   end
                 else
                   begin
-                    reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+                    reference_reset_symbol(href,ref.symbol,0,ref.alignment);
                     hreg:=getaddressregister(list);
                     href.refaddr:=addr_pic;
                     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;
       end;
 
+    procedure create_codegen;
 
   implementation
 
@@ -245,7 +246,10 @@ unit cgcpu;
         List.concat(Tai_symbol_end.Createname(labelname));
       end;
 
-
-begin
-  cg:=tcgx86_64.create;
+      
+    procedure create_codegen;
+      begin
+        cg:=tcgx86_64.create;
+      end;
+      
 end.

+ 1 - 1
ide/Makefile.fpc

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

+ 103 - 8
ide/fpdebug.pas

@@ -51,6 +51,7 @@ type
      HasExe   : boolean;
      RunCount : longint;
      WindowWidth : longint;
+     TBreakNumber : longint;
      FPCBreakErrorNumber : longint;
 {$ifdef SUPPORT_REMOTE}
      isRemoteDebugging:boolean;
@@ -65,6 +66,9 @@ type
     procedure DoBreakSession;virtual;}
     procedure DoEndSession(code:longint);virtual;
     procedure DoUserSignal;virtual;
+    procedure FlushAll; virtual;
+    function Query(question : pchar; args : pchar) : longint; virtual;
+
     procedure AnnotateError;
     procedure InsertBreakpoints;
     procedure RemoveBreakpoints;
@@ -334,8 +338,10 @@ uses
 {$ifdef DOS}
   fpusrscr,
 {$endif DOS}
+
   App,Strings,
   FVConsts,
+  MsgBox,
 {$ifdef Windows}
   Windebug,
 {$endif Windows}
@@ -603,7 +609,8 @@ procedure UpdateDebugViews;
 
   begin
 {$ifdef SUPPORT_REMOTE}
-     PushStatus(msg_getting_info_on+RemoteMachine);
+     if isRemoteDebugging then
+       PushStatus(msg_getting_info_on+RemoteMachine);
 {$endif SUPPORT_REMOTE}
      DeskTop^.Lock;
      If assigned(StackWindow) then
@@ -620,7 +627,8 @@ procedure UpdateDebugViews;
        VectorWindow^.Update;
      DeskTop^.UnLock;
 {$ifdef SUPPORT_REMOTE}
-     PopStatus;
+     if isRemoteDebugging then
+       PopStatus;
 {$endif SUPPORT_REMOTE}
   end;
 
@@ -648,6 +656,10 @@ begin
     begin
       LoadFile(f);
       HasExe:=true;
+      { Procedure HandleErrorAddrFrame
+         (Errno : longint;addr,frame : longint);
+         [public,alias:'FPC_BREAK_ERROR'];
+      Command('b HANDLEERRORADDRFRAME'); }
       Command('b FPC_BREAK_ERROR');
       FPCBreakErrorNumber:=last_breakpoint_number;
 {$ifdef FrameNameKnown}
@@ -826,6 +838,8 @@ begin
            PopStatus;
            exit;
         end;
+      s:=IDEApp.GetRemoteExecString;
+      MessageBox(#3'Start in remote'#13#3+s,nil,mfOKbutton);
       PopStatus;
     end
   else
@@ -941,6 +955,76 @@ begin
     GDBWindow^.WriteString(S);
 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);
 begin
   if assigned(GDBWindow) and (in_command<=1) then
@@ -1269,7 +1353,13 @@ begin
        end
       else if not assigned(PB) then
         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
       { For watch we should get old and new value !! }
       else if (Not assigned(GDBWindow) or not GDBWindow^.GetState(sfActive)) and
@@ -1377,14 +1467,15 @@ begin
   if NoSwitch then
     begin
 {$ifdef SUPPORT_REMOTE}
-      PushStatus(msg_runningremotely+RemoteMachine);
-{$else not SUPPORT_REMOTE}
+      if isRemoteDebugging then
+        PushStatus(msg_runningremotely+RemoteMachine)
+      else
+{$endif SUPPORT_REMOTE}
 {$ifdef Unix}
       PushStatus(msg_runninginanotherwindow+DebuggeeTTY);
 {$else not Unix}
       PushStatus(msg_runninginanotherwindow);
 {$endif Unix}
-{$endif not SUPPORT_REMOTE}
     end
   else
     begin
@@ -3508,15 +3599,17 @@ end;
 
 function GetGDBTargetShortName : string;
 begin
+{$ifndef CROSSGDB}
+GetGDBTargetShortName:=source_info.shortname;
+{$else CROSSGDB}
 {$ifdef SUPPORT_REMOTE}
 {$ifdef PALMOSGDB}
 GetGDBTargetShortName:='palmos';
 {$else}
 GetGDBTargetShortName:='linux';
 {$endif PALMOSGDB}
-{$else not SUPPORT_REMOTE}
-GetGDBTargetShortName:=source_info.shortname
 {$endif not SUPPORT_REMOTE}
+{$endif CROSSGDB}
 end;
 
 procedure InitDebugger;
@@ -3556,6 +3649,7 @@ begin
 {$endif}
 
   NeedRecompileExe:=false;
+{$ifndef SUPPORT_REMOTE}
   if UpCaseStr(TargetSwitches^.GetCurrSelParam)<>UpCaseStr(GetGDBTargetShortName) then
     begin
      ClearFormatParams;
@@ -3575,6 +3669,7 @@ begin
          IDEApp.UpdateTarget;
        end;
     end;
+{$endif ndef SUPPORT_REMOTE}
   if not NeedRecompileExe then
     NeedRecompileExe:=(not ExistsFile(ExeFile)) or (CompilationPhase<>cpDone) or
      (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_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.}
                 dialog_directories = 'Directories';
 

+ 2 - 2
ide/test.pas

@@ -45,13 +45,13 @@ type
       end;
 
       TClass = class
-        constructor Create;
         name : string;
+        constructor Create;
       end;
 
       TClass2 = class(TClass)
-        constructor Create;
         X : longint;
+        constructor Create;
       end;
 
       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);
  {$endif}
 
-  m:=fchmr.getobject(fchmr.indexfile);
+
+  findex:=fchmr.GetIndexSitemap(false);
+(*  m:=fchmr.getobject(fchmr.indexfile);
   try
    if assigned(m) then
      begin
@@ -141,6 +143,7 @@ begin
   finally
     freeandnil(m);
     end;
+    *)
    {$ifdef wdebug}
      debugmessageS({$i %file%},'TCHMWrapper: loadindex after final ',{$i %line%},'1',0,0);
   {$endif}
@@ -148,6 +151,12 @@ begin
   tli:=TopicLinks^.AddItem(fchmr.defaultpage);
   TLI:=EncodeHTMLCtx(ID,TLI+1);
   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
     begin
       item:=findex.items.item[i];
@@ -289,7 +298,7 @@ begin
                Afileid:=chmw.fileid;
                alinkid:=chmw.fTopicLinks.additem(restlink);
                result:=true;
-            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
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 # Source 4
-package=units-graph.source.zip[ugrphsrc.zip],Unit Graph
+package=ide.source.zip[idesrc.zip],IDE sources
 # Source 5
 package=utils.source.zip[utilsrc.zip],~U~tils sources
 # 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
 # Source 15
 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

+ 1 - 1
installer/install.pas

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

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 256 - 69
packages/Makefile


+ 46 - 25
packages/Makefile.fpc

@@ -4,8 +4,8 @@
 #
 
 [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_x86_64_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 \
                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 \
-               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 \
-                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_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_powerpc64_darwin=opengl x11 cairo gtk1 gtk2 librsvg fpgtk xforms gnome1 httpd13 httpd20 httpd22 imlib
 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 \
-               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
 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 \
@@ -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
 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 \
-               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
 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
 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_os2=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_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_debug: paszlib_debug
 fcl-base_smart: paszlib_smart
@@ -88,18 +88,32 @@ fcl-base_release: paszlib_release
 fcl-base_shared: paszlib_shared
 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),)
-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_debug: univint_debug
 cocoaint_smart: univint_smart
 cocoaint_release: univint_release
 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
 
 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_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_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
 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
 endif
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)

+ 1 - 1
packages/chm/Makefile.fpc

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

+ 6 - 1
packages/chm/fpmake.pp

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

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

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

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

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

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

@@ -116,7 +116,8 @@ type
   public
     function GetContextUrl(Context: THelpContext): String;
     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;
     property DefaultPage: String read fDefaultPage;
     property IndexFile: String read fIndexFile;
@@ -875,7 +876,241 @@ begin
   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;
     var
       Props: DWord;
@@ -919,8 +1154,9 @@ begin
    Result := nil;
    // First Try Binary
    TOC := GetObject('/#TOCIDX');
-   if TOC = nil then
+   if (TOC = nil) or ForceXML then
    begin
+     if Assigned(TOC) Then Toc.Free;
      // Second Try text toc
      TOC := GetObject(TOCFile);
      if TOC <> nil then

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

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

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

@@ -25,13 +25,13 @@ unit chmtypes;
 interface
 
 uses
-  Classes, SysUtils; 
-  
+  Classes, SysUtils;
+
 type
   TSectionName = (snMSCompressed, snUnCompressed);
-  
+
   TSectionNames = set of TSectionName;
-  
+
    { TDirectoryChunk }
 
   TDirectoryChunk = class(TObject)
@@ -52,7 +52,7 @@ type
     property ItemCount: Word read FItemCount;
     constructor Create(AHeaderSize: Integer);
   end;
-  
+
   { TPMGIDirectoryChunk }
 
   TPMGIDirectoryChunk = class(TDirectoryChunk)
@@ -134,8 +134,60 @@ type
     Unknown: Word; // 0,2,4,8,10,12,16,32
   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
 uses chmbase;
@@ -174,7 +226,7 @@ begin
   Move(Data^, Buffer[CurrentPos], Size);
   Inc(CurrentPos, Size);
   Inc(FItemCount);
-  
+
   // now put a quickref entry if needed
   if ItemCount mod 5 = 0 then begin
     Inc(FQuickRefEntries);
@@ -312,7 +364,7 @@ begin
   WriteChunkToStream(Stream);
   NewPos := Stream.Position;
   Inc(FChunkLevelCount);
-  
+
   if Final and (ChunkLevelCount < 2) then begin
     FParentChunk.Free;
     FParentChunk := nil;
@@ -332,7 +384,7 @@ begin
   if not FParentChunk.CanHold(WriteSize) then begin
     FinishBlock;
   end;
-  
+
   FParentChunk.WriteEntry(WriteSize, @NewBuffer[0]);
   if Final then FinishBlock;
   //WriteLn(ChunkLevelCount);

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 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
     else begin
       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;
 {$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}
     lzxd^.put_bytes(lzxd^.out_arg, sizeof(lzxd^.bit_buf), @lzxd^.bit_buf);
     Inc(lzxd^.len_compressed_output, sizeof(lzxd^.bit_buf));
@@ -726,8 +726,8 @@ begin
   //   otherwise move bits in */
   shift_bits := nbits;
   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);
 
   lzxd^.bits_in_buf := cur_bits;
@@ -892,8 +892,8 @@ begin
 	  Inc(freqs[19]);
 	  //* right, MS lies again.  Code is NOT
 	  //   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(codep);
 	  runp^ := 0; //* not necessary */
@@ -901,8 +901,8 @@ begin
 	  Dec(cur_run, excess+4);
         end;
 	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 */
           Inc(runp);
 	  Dec(cur_run);
@@ -1151,6 +1151,7 @@ begin
   freemem(lzxd^.prev_main_treelengths);
   freemem(lzxd^.main_tree);
   freemem(lzxd^.main_freq_table);
+  freemem(lzxd^.block_codes);
   dispose(lzxd);
   Exit(0);
 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
 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}
 endif
 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
 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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
 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
 endif
 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
 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
 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
 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
 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
 endif
 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
 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
 endif
 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
 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
@@ -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
 endif
 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
 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
 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
@@ -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
 endif
 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
 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
@@ -1924,8 +1924,6 @@ REQUIRE_PACKAGES_RTL=1
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 REQUIRE_PACKAGES_RTL=1
-REQUIRE_PACKAGES_WINUNITS-BASE=1
-REQUIRE_PACKAGES_WINUNITS-JEDI=1
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
@@ -2049,8 +2047,6 @@ REQUIRE_PACKAGES_UNIVINT=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
-REQUIRE_PACKAGES_WINUNITS-BASE=1
-REQUIRE_PACKAGES_WINUNITS-JEDI=1
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
@@ -2125,58 +2121,6 @@ ifdef UNITDIR_RTL
 override COMPILER_UNITDIR+=$(UNITDIR_RTL)
 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
 PACKAGEDIR_UNIVINT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /univint/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_UNIVINT),)

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

@@ -7,8 +7,6 @@ name=fcl-base
 version=2.5.1
 
 [require]
-packages_win32=winunits-base winunits-jedi
-packages_win64=winunits-base winunits-jedi
 packages_darwin=univint
 
 [target]
@@ -19,14 +17,14 @@ units=contnrs inifiles rtfpars idea base64 gettext \
       maskutils fpexprpars ascii85
 units_beos=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
 # syncobjs requires GetLastOSError function
 units_netware=syncobjs

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

@@ -340,7 +340,7 @@ begin
   EndMethod(Strings,S);
   // AcceptVisitor
   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;
   EndMethod(Strings,S);
   S:=BeginSetupParams(Strings,C,ObjectClassName,True);
@@ -431,7 +431,7 @@ begin
   // Common setup case
   If (V in [voCreate,voUpdate]) and (UseCommonSetupParams) then
     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'
   else
     A:='TtiVisitorSelect';
@@ -1226,7 +1226,7 @@ begin
 end;
 
 Initialization
-  RegisterCodeGenerator('tiOPF','tiOPF class and visitors for the data',TTiOPFCodeGenerator);
+  RegisterCodeGenerator('tiOPF','tiOPF classes and hard-coded visitors for the data',TTiOPFCodeGenerator);
 
 Finalization
   UnRegisterCodeGenerator(TTiOPFCodeGenerator);

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

@@ -1279,6 +1279,8 @@ begin
     begin
     Addln(Strings,'Unit '+CodeOptions.UnitName+';');
     Addln(Strings);
+    Addln(Strings, '{$mode objfpc}{$H+}');
+    Addln(Strings);
     Addln(Strings,'Interface');
     Addln(Strings);
     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 !? }
 
-  function ImportFieldDef : boolean;
+  function ImportFieldDef(APosition : Integer) : boolean;
   var FD : TDDFieldDef;
       n, s : string;
   begin
@@ -497,7 +497,7 @@ Var
         FD.Required:=false
     else
       FD.Required:=false;
-    FD.index := FPosition.AsInteger;
+    FD.index := APosition;
     s := trim(FDomainName.asstring);
     if copy(s, 1, 4) <> 'RDB$' then
       FD.DomainName := s
@@ -513,7 +513,7 @@ Var
     BindFields;
     while not Q.eof do
       begin
-      if ImportFieldDef then
+      if ImportFieldDef(Result) then
         inc (result);
       Q.Next;
       end;

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

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

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

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

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

@@ -555,7 +555,12 @@ begin
           SQLData := AllocMem(in_SQLDA^.SQLVar[x].SQLLen+2)
         else
           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;
       {$R+}
       end
@@ -778,13 +783,10 @@ begin
     ParNr := ParamBinding[SQLVarNr];
     VSQLVar := @in_sqlda^.SQLvar[SQLVarNr];
     if AParams[ParNr].IsNull then
-      begin
-      If Assigned(VSQLVar^.SQLInd) then
-        VSQLVar^.SQLInd^ := -1;
-      end
+      VSQLVar^.SQLInd^ := -1
     else
       begin
-      if assigned(VSQLVar^.SQLInd) then VSQLVar^.SQLInd^ := 0;
+      VSQLVar^.SQLInd^ := 0;
 
       case (VSQLVar^.sqltype and not 1) of
         SQL_LONG :

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

@@ -338,17 +338,19 @@ begin
 end;
 
 procedure TConnectionName.DoInternalConnect;
+var ClientVerStr: string;
 begin
   InitialiseMysql;
+  ClientVerStr := copy(strpas(mysql_get_client_info()),1,3);
 {$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())]);
 {$ELSE}
   {$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())]);
   {$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())]);
   {$ENDIF}
 {$ENDIF}

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

@@ -1504,17 +1504,23 @@ begin
                qry := FUpdateQry;
                end;
     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;
                end;
     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;
                end;
   end;

Vissa filer visades inte eftersom för många filer har ändrats