ソースを参照

* synchronized with trunk

git-svn-id: branches/wasm@46407 -
nickysn 5 年 前
コミット
de29036512
48 ファイル変更9112 行追加388 行削除
  1. 19 7
      .gitattributes
  2. 143 80
      compiler/aarch64/cgcpu.pas
  3. 25 6
      compiler/comprsrc.pas
  4. 2 1
      compiler/msg/errore.msg
  5. 1 1
      compiler/msgidx.inc
  6. 152 153
      compiler/msgtxt.inc
  7. 2 2
      compiler/nflw.pas
  8. 2 0
      compiler/options.pas
  9. 3 0
      compiler/rescmn.pas
  10. 0 39
      packages/fcl-base/examples/dbugsrv.pp
  11. 0 6
      packages/fcl-base/fpmake.pp
  12. 1 1
      packages/fcl-base/src/fpexprpars.pp
  13. 0 0
      packages/fcl-extra/examples/showver.pp
  14. 0 0
      packages/fcl-extra/examples/showver.rc
  15. 0 0
      packages/fcl-extra/examples/showver.res
  16. 12 0
      packages/fcl-extra/fpmake.pp
  17. 0 0
      packages/fcl-extra/src/fileinfo.pp
  18. 3 1
      packages/fcl-passrc/src/paswrite.pp
  19. 142 0
      packages/fcl-process/examples/dbugsrv.pp
  20. 30 24
      packages/fcl-process/src/dbugintf.pp
  21. 1 1
      packages/fcl-process/src/dbugmsg.pp
  22. 27 0
      packages/fcl-res/fpmake.pp
  23. 1363 0
      packages/fcl-res/src/rclex.inc
  24. 121 0
      packages/fcl-res/src/rclex.l
  25. 2747 0
      packages/fcl-res/src/rcparser.pas
  26. 234 0
      packages/fcl-res/src/rcparser.y
  27. 435 0
      packages/fcl-res/src/rcparserfn.inc
  28. 133 0
      packages/fcl-res/src/rcreader.pp
  29. 1 0
      packages/fcl-res/src/resource.pp
  30. 21 35
      packages/fcl-res/src/stringtableresource.pp
  31. 127 0
      packages/fcl-res/src/yyinclude.pp
  32. 160 0
      packages/fcl-res/src/yypreproc.pp
  33. 1 0
      packages/fpmake_add.inc
  34. 6 0
      packages/fpmake_proc.inc
  35. 2 3
      packages/pastojs/src/pas2jslibcompiler.pp
  36. 2745 0
      packages/tplylib/Makefile
  37. 102 0
      packages/tplylib/Makefile.fpc
  38. 54 0
      packages/tplylib/fpmake.pp
  39. 14 11
      packages/tplylib/src/lexlib.pas
  40. 0 0
      packages/tplylib/src/yacclib.pas
  41. 173 0
      tests/webtbs/tw37554.pp
  42. 9 3
      utils/fpcres/fpcres.pas
  43. 54 0
      utils/fpcres/paramparser.pas
  44. 33 6
      utils/fpcres/sourcehandler.pas
  45. 2 4
      utils/tply/fpmake.pp
  46. 2 1
      utils/tply/lexdfa.pas
  47. 4 0
      utils/tply/lextable.pas
  48. 4 3
      utils/tply/plex.pas

+ 19 - 7
.gitattributes

@@ -3169,7 +3169,6 @@ packages/fcl-base/examples/contit.pp svneol=native#text/plain
 packages/fcl-base/examples/crittest.pp svneol=native#text/plain
 packages/fcl-base/examples/csvbom.pp svneol=native#text/plain
 packages/fcl-base/examples/databom.txt svneol=native#text/plain
-packages/fcl-base/examples/dbugsrv.pp svneol=native#text/plain
 packages/fcl-base/examples/debugtest.pp svneol=native#text/plain
 packages/fcl-base/examples/decodeascii85.pp svneol=native#text/plain
 packages/fcl-base/examples/demoio.pp svneol=native#text/plain
@@ -3210,9 +3209,6 @@ packages/fcl-base/examples/parser.dat -text
 packages/fcl-base/examples/poolmm1.pp svneol=native#text/plain
 packages/fcl-base/examples/poolmm2.pp svneol=native#text/plain
 packages/fcl-base/examples/restest.pp svneol=native#text/plain
-packages/fcl-base/examples/showver.pp svneol=native#text/plain
-packages/fcl-base/examples/showver.rc -text
-packages/fcl-base/examples/showver.res -text
 packages/fcl-base/examples/simple.xml -text
 packages/fcl-base/examples/sitest.pp svneol=native#text/plain
 packages/fcl-base/examples/sockcli.pp svneol=native#text/plain
@@ -3274,7 +3270,6 @@ packages/fcl-base/src/csvreadwrite.pp svneol=native#text/plain
 packages/fcl-base/src/custapp.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/fileinfo.pp svneol=native#text/plain
 packages/fcl-base/src/fpexprpars.pp svneol=native#text/plain
 packages/fcl-base/src/fpobserver.pp svneol=native#text/plain
 packages/fcl-base/src/fptemplate.pp svneol=native#text/plain
@@ -3627,8 +3622,12 @@ packages/fcl-extra/examples/double/daemonunit2.lfm svneol=native#text/plain
 packages/fcl-extra/examples/double/daemonunit2.pas svneol=native#text/plain
 packages/fcl-extra/examples/double/double.pp svneol=native#text/plain
 packages/fcl-extra/examples/double/resdaemonapp.pp svneol=native#text/plain
+packages/fcl-extra/examples/showver.pp svneol=native#text/pascal
+packages/fcl-extra/examples/showver.rc svneol=native#text/plain
+packages/fcl-extra/examples/showver.res -text
 packages/fcl-extra/fpmake.pp svneol=native#text/pascal
 packages/fcl-extra/src/daemonapp.pp svneol=native#text/plain
+packages/fcl-extra/src/fileinfo.pp svneol=native#text/pascal
 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
@@ -3940,6 +3939,7 @@ packages/fcl-process/Makefile.fpc svneol=native#text/plain
 packages/fcl-process/Makefile.fpc.fpcmake svneol=native#text/plain
 packages/fcl-process/examples/checkipcserver.lpi svneol=native#text/plain
 packages/fcl-process/examples/checkipcserver.lpr svneol=native#text/plain
+packages/fcl-process/examples/dbugsrv.pp svneol=native#text/plain
 packages/fcl-process/examples/demoproject.ico -text
 packages/fcl-process/examples/demoproject.lpi svneol=native#text/plain
 packages/fcl-process/examples/demoproject.pp svneol=native#text/plain
@@ -4156,6 +4156,12 @@ packages/fcl-res/src/machosubreader.inc svneol=native#text/plain
 packages/fcl-res/src/machosubwriter.inc svneol=native#text/plain
 packages/fcl-res/src/machotypes.pp svneol=native#text/plain
 packages/fcl-res/src/machowriter.pp svneol=native#text/plain
+packages/fcl-res/src/rclex.inc svneol=native#text/plain
+packages/fcl-res/src/rclex.l svneol=native#text/plain
+packages/fcl-res/src/rcparser.pas svneol=native#text/pascal
+packages/fcl-res/src/rcparser.y svneol=native#text/plain
+packages/fcl-res/src/rcparserfn.inc svneol=native#text/plain
+packages/fcl-res/src/rcreader.pp svneol=native#text/pascal
 packages/fcl-res/src/resdatastream.pp svneol=native#text/plain
 packages/fcl-res/src/resfactory.pp svneol=native#text/plain
 packages/fcl-res/src/resmerger.pp svneol=native#text/plain
@@ -4171,6 +4177,8 @@ packages/fcl-res/src/versionresource.pp svneol=native#text/plain
 packages/fcl-res/src/versiontypes.pp svneol=native#text/plain
 packages/fcl-res/src/winpeimagereader.pp svneol=native#text/plain
 packages/fcl-res/src/xcoffwriter.pp svneol=native#text/plain
+packages/fcl-res/src/yyinclude.pp svneol=native#text/pascal
+packages/fcl-res/src/yypreproc.pp svneol=native#text/pascal
 packages/fcl-res/xml/acceleratorsresource.xml svneol=native#text/plain
 packages/fcl-res/xml/bitmapresource.xml svneol=native#text/plain
 packages/fcl-res/xml/clean.sh svneol=native#text/plain
@@ -9109,6 +9117,11 @@ packages/tosunits/src/aes.pas svneol=native#text/plain
 packages/tosunits/src/gemdos.pas svneol=native#text/plain
 packages/tosunits/src/vdi.pas svneol=native#text/plain
 packages/tosunits/src/xbios.pas svneol=native#text/plain
+packages/tplylib/Makefile svneol=native#text/plain
+packages/tplylib/Makefile.fpc svneol=native#text/plain
+packages/tplylib/fpmake.pp svneol=native#text/pascal
+packages/tplylib/src/lexlib.pas svneol=native#text/pascal
+packages/tplylib/src/yacclib.pas svneol=native#text/pascal
 packages/univint/Makefile svneol=native#text/plain
 packages/univint/Makefile.fpc svneol=native#text/plain
 packages/univint/Makefile.fpc.fpcmake svneol=native#text/plain
@@ -18451,6 +18464,7 @@ tests/webtbs/tw37477.pp svneol=native#text/pascal
 tests/webtbs/tw37493.pp svneol=native#text/pascal
 tests/webtbs/tw37508.pp svneol=native#text/pascal
 tests/webtbs/tw3751.pp svneol=native#text/plain
+tests/webtbs/tw37554.pp svneol=native#text/pascal
 tests/webtbs/tw3758.pp svneol=native#text/plain
 tests/webtbs/tw3764.pp svneol=native#text/plain
 tests/webtbs/tw3765.pp svneol=native#text/plain
@@ -19532,7 +19546,6 @@ utils/tply/README.txt svneol=native#text/plain
 utils/tply/fpmake.pp svneol=native#text/plain
 utils/tply/lexbase.pas svneol=native#text/plain
 utils/tply/lexdfa.pas svneol=native#text/plain
-utils/tply/lexlib.pas svneol=native#text/plain
 utils/tply/lexlist.pas svneol=native#text/plain
 utils/tply/lexmsgs.pas svneol=native#text/plain
 utils/tply/lexopt.pas svneol=native#text/plain
@@ -19546,7 +19559,6 @@ utils/tply/tply.doc -text
 utils/tply/tply.tex -text
 utils/tply/yaccbase.pas svneol=native#text/plain
 utils/tply/yaccclos.pas svneol=native#text/plain
-utils/tply/yacclib.pas svneol=native#text/plain
 utils/tply/yacclook.pas svneol=native#text/plain
 utils/tply/yacclr0.pas svneol=native#text/plain
 utils/tply/yaccmsgs.pas svneol=native#text/plain

+ 143 - 80
compiler/aarch64/cgcpu.pas

@@ -580,102 +580,165 @@ implementation
 
     procedure tcgaarch64.a_load_const_reg(list: TAsmList; size: tcgsize; a: tcgint; reg : tregister);
       var
-        preva: tcgint;
         opc: tasmop;
-        shift,maxshift: byte;
+        shift: byte;
         so: tshifterop;
-        reginited: boolean;
-        mask: tcgint;
+        reginited,doinverted: boolean;
+        manipulated_a: tcgint;
+        leftover_a: word;
       begin
-        { if we load a value into a 32 bit register, it is automatically
-          zero-extended to 64 bit }
-        if (hi(a)=0) and
-           (size in [OS_64,OS_S64]) then
-          begin
-            size:=OS_32;
-            reg:=makeregsize(reg,size);
-          end;
-        { values <= 32 bit are stored in a 32 bit register }
-        if not(size in [OS_64,OS_S64]) then
-          a:=cardinal(a);
-
-        if size in [OS_64,OS_S64] then
-          begin
-            mask:=-1;
-            maxshift:=64;
-          end
-        else
-          begin
-            mask:=$ffffffff;
-            maxshift:=32;
-          end;
-        { single movn enough? (to be extended) }
-        shift:=16;
-        preva:=a;
-        repeat
-          if (a shr shift)=(mask shr shift) then
+        case a of
+          { Small positive number }
+          $0..$FFFF:
             begin
-              if shift=16 then
-                list.concat(taicpu.op_reg_const(A_MOVN,reg,not(word(preva))))
+              list.concat(taicpu.op_reg_const(A_MOVZ, reg, a));
+              Exit;
+            end;
+          { Small negative number }
+          -65536..-1:
+            begin
+              list.concat(taicpu.op_reg_const(A_MOVN, reg, Word(not a)));
+              Exit;
+            end;
+          { Can be represented as a negative number more compactly }
+          $FFFF0000..$FFFFFFFF:
+            begin
+              { if we load a value into a 32 bit register, it is automatically
+                zero-extended to 64 bit }
+              list.concat(taicpu.op_reg_const(A_MOVN, makeregsize(reg,OS_32), Word(not a)));
+              Exit;
+            end;
+          else
+            begin
+
+              if size in [OS_64,OS_S64] then
+                begin
+                  { Check to see if a is a valid shifter constant that can be encoded in ORR as is }
+                  if is_shifter_const(a,size) then
+                    begin
+                      list.concat(taicpu.op_reg_reg_const(A_ORR,reg,makeregsize(NR_XZR,size),a));
+                      Exit;
+                    end;
+
+                  { This determines whether this write can be peformed with an ORR followed by MOVK
+                    by copying the 2nd word to the 4th word for the ORR constant, then overwriting
+                    the 4th word (unless the word is.  The alternative would require 3 instructions }
+                  leftover_a := word(a shr 48);
+                  manipulated_a := (a and $0000FFFFFFFFFFFF);
+
+                  if manipulated_a = $0000FFFFFFFFFFFF then
+                    begin
+                      { This is even better, as we can just use a single MOVN on the last word }
+                      shifterop_reset(so);
+                      so.shiftmode := SM_LSL;
+                      so.shiftimm := 48;
+                      list.concat(taicpu.op_reg_const_shifterop(A_MOVN, reg, word(not leftover_a), so));
+                      Exit;
+                    end;
+
+                  manipulated_a := manipulated_a or (((a shr 16) and $FFFF) shl 48);
+                  { if manipulated_a = a, don't check, because is_shifter_const was already
+                    called for a and it returned False.  Reduces processing time. [Kit] }
+                  if (manipulated_a <> a) and is_shifter_const(manipulated_a, size) then
+                    begin
+                      list.concat(taicpu.op_reg_reg_const(A_ORR, reg, makeregsize(NR_XZR, size), manipulated_a));
+                      if (leftover_a <> 0) then
+                        begin
+                          shifterop_reset(so);
+                          so.shiftmode := SM_LSL;
+                          so.shiftimm := 48;
+                          list.concat(taicpu.op_reg_const_shifterop(A_MOVK, reg, leftover_a, so));
+                        end;
+                      Exit;
+                    end;
+
+                  case a of
+                    { If a is in the given negative range, it can be stored
+                      more efficiently if it is inverted.  }
+                    TCgInt($FFFF000000000000)..-65537:
+                      begin
+                        { NOTE: This excluded range can be more efficiently
+                          stored as the first 16 bits followed by a shifter constant }
+                        case a of
+                          TCgInt($FFFF0000FFFF0000)..TCgInt($FFFF0000FFFFFFFF):
+                            doinverted := False
+                          else
+                            begin
+                              doinverted := True;
+                              a := not a;
+                            end;
+                        end;
+                      end;
+
+                    else
+                      doinverted := False;
+                  end;
+                end
               else
                 begin
-                  shifterop_reset(so);
-                  so.shiftmode:=SM_LSL;
-                  so.shiftimm:=shift-16;
-                  list.concat(taicpu.op_reg_const_shifterop(A_MOVN,reg,not(word(preva)),so));
+                  a:=cardinal(a);
+                  doinverted:=False;
                 end;
-              exit;
             end;
-          { only try the next 16 bits if the current one is all 1 bits, since
-            the movn will set all lower bits to 1 }
-          if word(a shr (shift-16))<>$ffff then
-            break;
-          inc(shift,16);
-        until shift=maxshift;
+        end;
+
         reginited:=false;
         shift:=0;
-        { can be optimized later to use more movn }
+
+        if doinverted then
+          opc:=A_MOVN
+        else
+          opc:=A_MOVZ;
+
         repeat
           { leftover is shifterconst? (don't check if we can represent it just
             as effectively with movz/movk, as this check is expensive) }
-          if ((shift<tcgsize2size[size]*(8 div 2)) and
-              (word(a)<>0) and
-              ((a shr 16)<>0)) and
-             is_shifter_const(a shl shift,size) then
+          if (word(a)<>0) then
             begin
-              if reginited then
-                list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,a shl shift))
+
+              if not doinverted and
+                ((shift<tcgsize2size[size]*(8 div 2)) and
+                  ((a shr 16)<>0)) and
+                 is_shifter_const(a shl shift,size) then
+                begin
+                  if reginited then
+                    list.concat(taicpu.op_reg_reg_const(A_ORR,reg,reg,a shl shift))
+                  else
+                    list.concat(taicpu.op_reg_reg_const(A_ORR,reg,makeregsize(NR_XZR,size),a shl shift));
+
+                  exit;
+                end;
+
+              { set all 16 bit parts <> 0 }
+              if shift=0 then
+                begin
+                  list.concat(taicpu.op_reg_const(opc,reg,word(a)));
+                  reginited:=true;
+                end
               else
-                list.concat(taicpu.op_reg_reg_const(A_ORR,reg,makeregsize(NR_XZR,size),a shl shift));
-              exit;
+                begin
+                  shifterop_reset(so);
+                  so.shiftmode:=SM_LSL;
+                  so.shiftimm:=shift;
+                  if not reginited then
+                    begin
+                      list.concat(taicpu.op_reg_const_shifterop(opc,reg,word(a),so));
+                      reginited:=true;
+                    end
+                  else
+                    begin
+                      if doinverted then
+                        list.concat(taicpu.op_reg_const_shifterop(A_MOVK,reg,word(not a),so))
+                      else
+                        list.concat(taicpu.op_reg_const_shifterop(A_MOVK,reg,word(a),so));
+                    end;
+                end;
             end;
-          { set all 16 bit parts <> 0 }
-          if (word(a)<>0) or
-             ((shift=0) and
-              (a=0)) then
-            if shift=0 then
-              begin
-                list.concat(taicpu.op_reg_const(A_MOVZ,reg,word(a)));
-                reginited:=true;
-              end
-            else
-              begin
-                shifterop_reset(so);
-                so.shiftmode:=SM_LSL;
-                so.shiftimm:=shift;
-                if not reginited then
-                  begin
-                    opc:=A_MOVZ;
-                    reginited:=true;
-                  end
-                else
-                  opc:=A_MOVK;
-                list.concat(taicpu.op_reg_const_shifterop(opc,reg,word(a),so));
-              end;
-            preva:=a;
-            a:=a shr 16;
-           inc(shift,16);
-        until word(preva)=preva;
+
+          a:=a shr 16;
+          inc(shift,16);
+        until a = 0;
+
         if not reginited then
           internalerror(2014102702);
       end;

+ 25 - 6
compiler/comprsrc.pas

@@ -78,13 +78,14 @@ procedure CollectResourceFiles;
 Var
   ResCompiler : String;
   RCCompiler  : String;
+  RCForceFPCRes : Boolean;
 
 implementation
 
 uses
   SysUtils,
   cutils,cfileutl,cclasses,
-  Globtype,Globals,Verbose,Fmodule, comphook,cpuinfo;
+  Globtype,Globals,Verbose,Fmodule, comphook,cpuinfo,rescmn;
 
 {****************************************************************************
                               TRESOURCEFILE
@@ -126,7 +127,10 @@ var
 begin
   if output=roRES then
     begin
-      s:=target_res.rccmd;
+      if RCForceFPCRes then
+        s:=FPCResRCArgs
+      else
+        s:=target_res.rccmd;
       Replace(s,'$RES',maybequoted(OutName));
       Replace(s,'$RC',maybequoted(fname));
       ObjUsed:=False;
@@ -162,7 +166,10 @@ var
 begin
   Result:=true;
   if output=roRES then
-    Bin:=SelectBin(RCCompiler,target_res.rcbin)
+    if RCForceFPCRes then
+      Bin:=SelectBin(RCCompiler,FPCResUtil)
+    else
+      Bin:=SelectBin(RCCompiler,target_res.rcbin)
   else
     Bin:=SelectBin(ResCompiler,target_res.resbin);
   if bin='' then
@@ -265,8 +272,11 @@ begin
   srcfilepath:=ExtractFilePath(current_module.mainsource);
   if output=roRES then
     begin
-      s:=target_res.rccmd;
-      if target_res.rcbin = 'windres' then
+      if RCForceFPCRes then
+        s:=FPCResRCArgs
+      else
+        s:=target_res.rccmd;
+      if (target_res.rcbin = 'windres') and not RCForceFPCRes then
         Replace(s,'$RC',WindresFileName(fname))
       else
         Replace(s,'$RC',maybequoted(fname));
@@ -317,7 +327,7 @@ begin
   if respath='' then
     respath:='.';
   Replace(s,'$INC',maybequoted(respath));
-  if (output=roRes) and (target_res.rcbin='windres') then
+  if (output=roRes) and (target_res.rcbin='windres') and not RCForceFPCRes then
   begin
     { try to find a preprocessor }
     preprocessorbin := respath+'cpp'+source_info.exeext;
@@ -555,4 +565,13 @@ begin
   resourcefile.free;
 end;
 
+procedure initglobals;
+begin
+  ResCompiler:='';
+  RCCompiler:='';
+  RCForceFPCRes:=false;
+end;
+
+initialization
+  register_initdone_proc(@initglobals,nil);
 end.

+ 2 - 1
compiler/msg/errore.msg

@@ -3960,8 +3960,9 @@ A*2CV<x>_Set section threadvar model to <x>
 **2Fd_Disable the compiler's internal directory cache
 **2FD<x>_Set the directory where to search for compiler utilities
 **2Fe<x>_Redirect error output to <x>
-**2Ff<x>_Add <x> to framework path (Darwin only)
 **2FE<x>_Set exe/unit output path to <x>
+**2Ff<x>_Add <x> to framework path (Darwin only)
+**2FF_Use fpcres as RC to RES compiler instead of windres or gorc
 **2Fi<x>_Add <x> to include path
 **2Fl<x>_Add <x> to library path
 **2FL<x>_Use <x> as dynamic linker

+ 1 - 1
compiler/msgidx.inc

@@ -1126,7 +1126,7 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 85624;
+  MsgTxtSize = 85690;
 
   MsgIdxMax : array[1..20] of longint=(
     28,106,356,129,99,63,143,36,223,68,

+ 152 - 153
compiler/msgtxt.inc

@@ -1,8 +1,8 @@
 const msgtxt_codepage=20127;
 {$ifdef Delphi}
-const msgtxt : array[0..000356] of string[240]=(
+const msgtxt : array[0..000357] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000356,1..240] of char=(
+const msgtxt : array[0..000357,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -1591,186 +1591,187 @@ const msgtxt : array[0..000356,1..240] of char=(
   '**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+
-  '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
-  '**2FE','<x>_Set exe/unit output path to <x>'#010+
+  '**2FE<x>_Set exe/unit output path to <x>'#010+
+  '**2Ff<x>_Add ','<x> to framework path (Darwin only)'#010+
+  '**2FF_Use fpcres as RC to RES compiler instead of windres or gorc'#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>_Set the directory wher','e to search for unicode binary files'#010+
+  '**2Fm<x>_Load unicode conversion tabl','e from <x>.txt in the compiler '+
+  'dir'#010+
+  '**2FM<x>_Set the directory where to search for unicode binary files'#010+
   '**2FN<x>_Add <x> to list of default unit scopes (namespaces)'#010+
   '**2Fo<x>_Add <x> to object path'#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,
+  '**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 previously stored whole-program optimization feedback fr'+
-  'om <x>'#010+
-  '*g1g_Generate debug information (default fo','rmat for target)'#010+
+  '**2Fw<x>_Load previously stored whole-program optimiza','tion feedback '+
+  'from <x>'#010+
+  '*g1g_Generate debug information (default format for target)'#010+
   '*g2gc_Generate checks for pointers (experimental, only available on so'+
   'me targets, might generate false positive)'#010+
-  '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
-  '*g2gl_Use line info unit (show more info with ','backtraces)'#010+
+  '*g2gh_Use heaptrace unit (for memory leak/co','rruption debugging)'#010+
+  '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2gm_Generate Microsoft CodeView debug information (experimental)'#010+
   '*g2go<x>_Set debug information options'#010+
-  '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+
-  'aks gdb < 6.5)'#010+
-  '*g3gostabsabsincludes_ Store absolute/full in','clude file paths in Sta'+
-  'bs'#010+
+  '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug informatio','n (b'+
+  'reaks gdb < 6.5)'#010+
+  '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
+  #010+
   '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
   'ame'#010+
   '*g3godwarfcpp_ Simulate C++ debug information in DWARF'#010+
-  '*g3godwarfomflinnum_ Generate line number information in OMF LINNUM re'+
-  'cords in MS LIN','K format in addition to the DWARF debug information ('+
+  '*g3godwarfomflinnum','_ Generate line number information in OMF LINNUM '+
+  'records in MS LINK format in addition to the DWARF debug information ('+
   'Open Watcom Debugger/Linker compatibility)'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
-  '*g2gs_Generate Stabs debug information'#010+
-  '*g2gt_Trash local variables (to detect uninitialized uses; mult','iple '+
-  #039't'#039' changes the trashing value)'#010+
+  '*g2gs_Generate Stabs debug informati','on'#010+
+  '*g2gt_Trash local variables (to detect uninitialized uses; multiple '#039+
+  't'#039' changes the trashing value)'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
-  '*g2gw2_Generate DWARFv2 debug information'#010+
+  '*g2gw2_Generate DWARFv2 debug in','formation'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
-  '*g2gw4_Generat','e DWARFv4 debug information (experimental)'#010+
+  '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSP_Return compiler host processor'#010+
-  '**2iTO_Return target OS'#010+
+  '**2iTO_Return target OS',#010+
   '**2iTP_Return target processor'#010+
-  '**2iV_Return short compiler versio','n'#010+
+  '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2ia_Return list of supported ABI targets'#010+
   '**2ib_Return the used code generation backend type'#010+
-  '**2ic_Return list of supported CPU instruction sets'#010+
+  '**2ic_Return list of supported CPU instruct','ion sets'#010+
   '**2if_Return list of supported FPU instruction sets'#010+
-  '**2ii','_Return list of supported inline assembler modes'#010+
+  '**2ii_Return list of supported inline assembler modes'#010+
   '**2im_Return list of supported modeswitches'#010+
   '**2io_Return list of supported optimizations'#010+
-  '**2ir_Return list of recognized compiler and RTL features'#010+
+  '**2ir_Return list of recognized comp','iler and RTL features'#010+
   '**2it_Return list of supported targets'#010+
-  '**2iu','_Return list of supported microcontroller types'#010+
+  '**2iu_Return list of supported microcontroller types'#010+
   '**2iw_Return list of supported whole program optimizations'#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> / enable modeswitch <','x> (see option'+
-  ' -im)'#010+
+  '**1l','_Write logo'#010+
+  '**1M<x>_Set language mode to <x> / enable modeswitch <x> (see option -'+
+  'im)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mobjfpc_FPC mode with Object Pascal support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
-  '**2Mtp_TP/BP 7.0 compatibility mode'#010+
+  '**2Mtp_TP/BP 7.0 compatibility',' mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
-  '**2M','iso_ISO 7185 mode'#010+
+  '**2Miso_ISO 7185 mode'#010+
   '**2Mextendedpascal_ISO 10206 mode'#010+
   '**2Mdelphiunicode_Delphi 2009 and later compatibility mode'#010+
-  '**2*_Each mode (as listed above) enables its default set of modeswitch'+
-  'es.'#010+
-  '**2*_Other modeswitches are disabled and need to be ena','bled one by a'+
-  'nother.'#010+
+  '**2*_Each mode (as listed above) enables its default set of mod','eswit'+
+  'ches.'#010+
+  '**2*_Other modeswitches are disabled and need to be enabled one by ano'+
+  'ther.'#010+
   '**1M<x>-_Disable modeswitch <x> (see option -im)'#010+
   '**1n_Do not read the default config files'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
-  '**1O<x>_Optimizations:'#010+
+  '**1O','<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
-  '**2O1_Level 1 optim','izations (quick and debugger friendly)'#010+
+  '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
-  '**2O4_Level 4 optimizations (-O3 + optimizations which might have unex'+
-  'pected side effects)',#010+
+  '**2O4_Level 4 optimizati','ons (-O3 + optimizations which might have un'+
+  'expected side effects)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations; see fpc -i or fpc -io fo'+
   'r possible values'#010+
-  '**2Op<x>_Set target cpu for optimizing; see fpc -i or fpc -ic for poss'+
-  'ible values'#010+
-  '**2OW<x>_Generate whole-program optimizati','on feedback for optimizati'+
-  'on <x>; see fpc -i or fpc -iw for possible values'#010+
+  '**2Op<x>_Set target cpu for optimizing; see fpc -i or fpc ','-ic for po'+
+  'ssible values'#010+
+  '**2OW<x>_Generate whole-program optimization feedback for optimization'+
+  ' <x>; see fpc -i or fpc -iw for possible values'#010+
   '**2Ow<x>_Perform whole-program optimization <x>; see fpc -i or fpc -iw'+
   ' for possible values'#010+
-  '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Generate profile code for',' gprof (defines FPC_PROFILE)'#010+
+  '**2Os_O','ptimize for size rather than speed'#010+
+  '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   'F*1P<x>_Target CPU / compiler related options:'#010+
   'F*2PB_Show default compiler binary'#010+
   'F*2PP_Show default target cpu'#010+
-  'F*2P<x>_Set target CPU (aarch64,arm,avr,i386,i8086,jvm,m68k,mips,mipse'+
-  'l,powerpc,powerpc64,sparc,x86','_64)'#010+
+  'F*2P<x>_Set target CPU (aarch64,a','rm,avr,i386,i8086,jvm,m68k,mips,mip'+
+  'sel,powerpc,powerpc64,sparc,x86_64)'#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+
-  '4*2Ratt_Read AT&T style assembler'#010+
+  '4*2Ratt_Read AT&T st','yle assembler'#010+
   '4*2Rintel_Read Intel style assembler'#010+
-  '8*2Ratt_Read AT','&T style assembler'#010+
+  '8*2Ratt_Read AT&T style assembler'#010+
   '8*2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read Motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
   '**2S2_Same as -Mobjfpc'#010+
-  '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
+  '**2Sc_Support operators like C (*','=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**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 following:'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_w : Compiler also halts after warnings'#010+
-  '**3*_n : Compiler also halts after notes'#010+
-  '**3*_h : Compiler also halts aft','er hints'#010+
+  '**3*_n ',': Compiler also halts after notes'#010+
+  '**3*_h : Compiler also halts after hints'#010+
   '**2Sf_Enable certain features in compiler and RTL; see fpc -i or fpc -'+
   'ir for possible values)'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use reference counted strings (ansistring by default) instead of'+
-  ' shortst','rings'#010+
+  '**2Sh_Use re','ference counted strings (ansistring by default) instead '+
+  'of shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sj_Allows typed constants to be writeable (default in all modes)'#010+
   '**2Sk_Load fpcylix unit'#010+
-  '**2SI<x>_Set interface style to <x>'#010+
-  '**3SIcom_COM compatible interface (def','ault)'#010+
+  '**2SI<x>','_Set interface style to <x>'#010+
+  '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2Sr_Transparent file names in ISO mode'#010+
-  '**2Ss_Constructor name must be init (destructor must be done)'#010+
-  '**2Sv_Support vector processing (use ','CPU vector extensions if availa'+
-  'ble)'#010+
+  '**2Ss_Constructor name must be in','it (destructor must be done)'#010+
+  '**2Sv_Support vector processing (use CPU vector extensions if availabl'+
+  'e)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
-  '**1s_Do not call assembler and linker'#010+
+  '**1s_Do not call as','sembler and linker'#010+
   '**2sh_Generate script to link on host'#010+
-  '**2st_Gen','erate script to link on target'#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*2Tandroid_Android'#010+
   '3*2Taros_AROS'#010+
   '3*2Tbeos_BeOS'#010+
-  '3*2Tdarwin_Darwin/Mac OS X'#010+
+  '3*2Tdarwi','n_Darwin/Mac OS X'#010+
   '3*2Tembedded_Embedded'#010+
-  '3*2Temx_OS/2 via EMX (incl','uding EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Thaiku_Haiku'#010+
-  '3*2Tiphonesim_iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tdar'+
-  'win)'#010+
+  '3*2Tiphonesim_iPhoneSimulator from iOS SDK 3.2+ (older versions: -','Td'+
+  'arwin)'#010+
   '3*2Tlinux_Linux'#010+
-  '3*2Tnativent_Native NT API (experimental)',#010+
+  '3*2Tnativent_Native NT API (experimental)'#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*2Tsymbian_Symbian OS'#010+
-  '3*2Tsolaris_Solaris'#010+
+  '3*','2Tsolaris_Solaris'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
-  '3*2Twd','osx_WDOSX DOS extender'#010+
+  '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '4*2Tandroid_Android'#010+
   '4*2Taros_AROS'#010+
   '4*2Tdarwin_Darwin/Mac OS X'#010+
   '4*2Tdragonfly_DragonFly BSD'#010+
-  '4*2Tembedded_Embedded'#010+
+  '4*2Tembedded_Emb','edded'#010+
   '4*2Tfreebsd_FreeBSD'#010+
   '4*2Thaiku_Haiku'#010+
-  '4*2Tiphonesim_iPhoneSimu','lator'#010+
+  '4*2Tiphonesim_iPhoneSimulator'#010+
   '4*2Tlinux_Linux'#010+
   '4*2Tnetbsd_NetBSD'#010+
   '4*2Topenbsd_OpenBSD'#010+
@@ -1778,20 +1779,20 @@ const msgtxt : array[0..000356,1..240] of char=(
   '4*2Twin64_Win64 (64 bit Windows systems)'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
-  '6*2Tembedded_Embedded'#010+
+  '6','*2Tembedded_Embedded'#010+
   '6*2Tlinux_Linux'#010+
   '6*2Tnetbsd_NetBSD'#010+
-  '6*2Tmacoscl','assic_Classic Mac OS'#010+
+  '6*2Tmacosclassic_Classic Mac OS'#010+
   '6*2Tpalmos_PalmOS'#010+
   '8*2Tembedded_Embedded'#010+
   '8*2Tmsdos_MS-DOS (and compatible)'#010+
   '8*2Twin16_Windows 16 Bit'#010+
   'A*2Tandroid_Android'#010+
   'A*2Taros_AROS'#010+
-  'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+
+  'A*2Tdarwin_Darwin/iP','honeOS/iOS'#010+
   'A*2Tembedded_Embedded'#010+
   'A*2Tfreertos_FreeRTOS'#010+
-  'A*2Tgba_Gam','e Boy Advance'#010+
+  'A*2Tgba_Game Boy Advance'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Tnds_Nintendo DS'#010+
   'A*2Tnetbsd_NetBSD'#010+
@@ -1800,10 +1801,10 @@ const msgtxt : array[0..000356,1..240] of char=(
   'A*2Twince_Windows CE'#010+
   'a*2Tandroid_Android'#010+
   'a*2Tdarwin_Darwin/iOS'#010+
-  'a*2Tlinux_Linux'#010+
+  'a*2Tl','inux_Linux'#010+
   'a*2Twin64_Windows 64'#010+
   'J*2Tandroid_Android'#010+
-  'J*2Tjava_Java'#010,
+  'J*2Tjava_Java'#010+
   'm*2Tandroid_Android'#010+
   'm*2Tembedded_Embedded'#010+
   'm*2Tlinux_Linux'#010+
@@ -1812,10 +1813,10 @@ const msgtxt : array[0..000356,1..240] of char=(
   'P*2Taix_AIX'#010+
   'P*2Tamiga_AmigaOS'#010+
   'P*2Tdarwin_Darwin/Mac OS X'#010+
-  'P*2Tembedded_Embedded'#010+
+  'P*2Tembedded_Embedded',#010+
   'P*2Tlinux_Linux'#010+
   'P*2Tmacosclassic_Classic Mac OS'#010+
-  'P*2Tmorphos_Morph','OS'#010+
+  'P*2Tmorphos_MorphOS'#010+
   'P*2Tnetbsd_NetBSD'#010+
   'P*2Twii_Wii'#010+
   'p*2Taix_AIX'#010+
@@ -1825,164 +1826,162 @@ const msgtxt : array[0..000356,1..240] of char=(
   'R*2Tlinux_Linux'#010+
   'R*2Tembedded_Embedded'#010+
   'r*2Tlinux_Linux'#010+
-  'r*2Tembedded_Embedded'#010+
+  'r*2Tembedd','ed_Embedded'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tsolaris_Solaris'#010+
   's*2Tlinux_Linux'#010+
-  'V*','2Tembedded_Embedded'#010+
+  'V*2Tembedded_Embedded'#010+
   'x*2Tembedded_Embedded'#010+
   'x*2Tfreertos_FreeRTOS'#010+
   'x*2Tlinux_Linux'#010+
   'Z*2Tembedded_Embedded'#010+
   'Z*2Tzxspectrum_ZX Spectrum'#010+
   'Z*2Tmsxdos_MSX-DOS'#010+
-  '**1u<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Undefines the symb','ol <x>'#010+
   '**1U_Unit options:'#010+
-  '**2Un_Do not check where the unit name m','atches the file name'#010+
+  '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
-  '**2*_e : Show errors (default)       0 : Show nothing (ex','cept errors'+
-  ')'#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*_i : Show general info           d : Show deb','ug info'#010+
+  '**2*_h : Show hints                  c : S','how 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 : Show everything             x : Show info about invoked tools'+
-  #010+
-  '**2*_b : Write file names mes','sages   p : Write tree.log with parse t'+
-  'ree'#010+
+  '**2*_a : Show everything          ','   x : Show info about invoked too'+
+  'ls'#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*_z : Write output to stderr          lots of debugging info'#010+
-  '**2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
-  'F*1V<x>_Ap','pend '#039'-<x>'#039' to the used compiler binary name (e.g.'+
-  ' for version)'#010+
+  '**','2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
+  'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+
+  'or version)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
   '3*2WA_Specify native type application (Windows)'#010+
-  '4*2WA_Specify native type application (Windows)'#010+
-  'A*2WA_Specify native type application ','(Windows)'#010+
+  '4*2WA_Specify native',' type application (Windows)'#010+
+  'A*2WA_Specify native type application (Windows)'#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+
-  'a*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'A*2Wb_Create a bundle ','instead of a library (Darwin)'#010+
+  'a*2Wb_Cr','eate a bundle instead of a library (Darwin)'#010+
+  'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '4*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '3*2WB_Create a relocatable image (Windows, Symbian)'#010+
-  '3*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+
+  '3*2WB<x>_Set image base to <x> (Windows,',' Symbian)'#010+
   '4*2WB_Create a relocatable image (Windows)'#010+
-  '4*2WB<x>_Set ','image base to <x> (Windows)'#010+
+  '4*2WB<x>_Set image base to <x> (Windows)'#010+
   'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   'A*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+
-  'Z*2WB<x>_Set image base to <x> (ZX Spectrum)'#010+
+  'Z*2WB<x>_Set image base to <x> (ZX Spectrum)',#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  '4*2WC','_Specify console type application (Windows)'#010+
+  '4*2WC_Specify console type application (Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
   'P*2WC_Specify console type application (Classic Mac OS)'#010+
-  '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  '4*2WD_Use DEFFILE to export f','unctions of DLL or EXE (Windows)'#010+
+  '3*2WD_Use DEFFILE to expo','rt functions of DLL or EXE (Windows)'#010+
+  '4*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+
   '4*2We_Use external resources (Darwin)'#010+
-  'a*2We_Use external resources (Darwin)'#010+
-  'A*2We_Use external resources (D','arwin)'#010+
+  'a*2','We_Use external resources (Darwin)'#010+
+  'A*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_Specify graphic type application (EMX, OS/2, Windows)'#010+
-  '4*2WG_Specify graphic type application (Wi','ndows)'#010+
+  '3*2WG_Specify graphic type applicati','on (EMX, OS/2, Windows)'#010+
+  '4*2WG_Specify graphic type application (Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   '3*2Wi_Use internal resources (Darwin)'#010+
-  '4*2Wi_Use internal resources (Darwin)'#010+
+  '4*2Wi_Use internal resou','rces (Darwin)'#010+
   'a*2Wi_Use internal resources (Darwin)'#010+
-  'A*2Wi_Use inte','rnal resources (Darwin)'#010+
+  'A*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'p*2Wi_Use internal resources (Darwin)'#010+
   '3*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  '4*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  'A*2WI_Turn on/off the usag','e of import sections (Windows)'#010+
+  '4*2WI_Turn on/off',' the usage of import sections (Windows)'#010+
+  'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
   '8*2Wh_Use huge code for units (ignored for models with CODE in a uniqu'+
   'e segment)'#010+
   '8*2Wm<x>_Set memory model'#010+
   '8*3WmTiny_Tiny memory model'#010+
-  '8*3WmSmall_Small memory model (default)'#010+
+  '8*3WmSma','ll_Small memory model (default)'#010+
   '8*3WmMedium_Medium memory model'#010+
-  '8*','3WmCompact_Compact memory model'#010+
+  '8*3WmCompact_Compact memory model'#010+
   '8*3WmLarge_Large memory model'#010+
   '8*3WmHuge_Huge memory model'#010+
   '3*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
-  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
-  'n)'#010+
-  'p*2W','M<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+
+  '4*2WM<x>_Mi','nimum Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+
   'win)'#010+
+  'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  'n)'#010+
   'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
-  '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  '4*2WN_Do not generate reloca','tion code, needed for debugging (Windows'+
+  '3*2WN_Do not generate relocation',' code, needed for debugging (Windows'+
   ')'#010+
+  '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
-  'le values'#010+
-  'm*2Wp<x>_Specify the controller type; see fpc -i',' or fpc -iu for poss'+
+  'A*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu fo','r poss'+
   'ible values'#010+
-  'R*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
+  'm*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'le values'#010+
-  'V*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
+  'R*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
   'le values'#010+
-  'x*2Wp<x>_Specify the controller type; see fpc -i',' or fpc -iu for poss'+
+  'V*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu fo','r poss'+
   'ible values'#010+
+  'x*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+
+  'le values'#010+
   '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+
   '4*2WP<x>_Minimum iOS deployment version: 8.0, 8.0.2, ... (iphonesim)'#010+
-  'a*2WP<x>_Minimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+
-  'A*2W','P<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
+  'a*2W','P<x>_Minimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+
+  'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '4*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation code (Windows)'#010+
+  'A*2WR_Generate relocation code',' (Windows)'#010+
   '8*2Wt<x>_Set the target executable format'#010+
-  '8*3Wtexe_Crea','te a DOS .EXE file (default)'#010+
+  '8*3Wtexe_Create a DOS .EXE file (default)'#010+
   '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
-  '**2WX_Enable executable stack (Linux)'#010+
+  '**2WX_Enable executable sta','ck (Linux)'#010+
   '**1X_Executable options:'#010+
-  '**2X9_Generate linkerscript fo','r GNU Binutils ld older than version 2'+
-  '.19.1 (Linux)'#010+
+  '**2X9_Generate linkerscript for GNU Binutils ld older than version 2.1'+
+  '9.1 (Linux)'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
-  '**2Xd_Do not search default library path (sometimes required for cross'+
-  '-compiling when not using -XR)'#010+
-  '**2Xe_Use ext','ernal linker'#010+
+  '**2Xd_Do not search default library path (someti','mes required for cro'+
+  'ss-compiling when not using -XR)'#010+
+  '**2Xe_Use external linker'#010+
   '**2Xf_Substitute pthread library name for linking (BSD)'#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+
+  '**2XD_Try to link uni','ts dynamically      (defines FPC_LINK_DYNAMIC)'#010+
+  '**2Xi_Use internal linker'#010+
   'L*2XlS<x>_LLVM utilties suffix (e.g. -7 in case clang is called clang-'+
   '7)'#010+
   '**2XLA_Define library substitutions for linking'#010+
   '**2XLO_Define order of library linking'#010+
-  '**2XLD_Exclude default order of standard libraries'#010+
-  '**2Xm_Generate link ma','p'#010+
+  '**2XLD_','Exclude default order of standard libraries'#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+
   '**2Xn_Use target system native linker instead of GNU ld (Solaris, AIX)'+
   #010+
-  'F*2Xp<x>_First search for the compiler binary in the directory <x>'#010+
-  '**2XP<x>_Prepend the binutil','s names with the prefix <x>'#010+
+  'F*2Xp<x>_First search for the',' compiler binary in the directory <x>'#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 OS, ','Solaris)'#010+
+  '**2XR<x>_Prepend <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+
+  '**2Xt_Link with static libraries (-static is passed to ','linker)'#010+
   '**2Xv_Generate table for Virtual Entry calls'#010+
-  '**2XV_Use VLi','nk as external linker       (default on Amiga, MorphOS)'+
-  #010+
+  '**2XV_Use VLink as external linker       (default on Amiga, MorphOS)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1?_Show this help'#010+
-  '**1h_Shows this help without waiting'
+  '**1h_Shows this help witho','ut waiting'
 );

+ 2 - 2
compiler/nflw.pas

@@ -2179,7 +2179,7 @@ implementation
               { nested exits don't need the non local goto switch }
               (labelsym.realname='$nestedexit') then
               begin
-                if current_procinfo.procdef.parast.symtablelevel>labelsym.owner.symtablelevel then
+                if current_procinfo.procdef.parast.symtablelevel>=labelsym.owner.symtablelevel then
                   begin
                     { don't mess with the exception blocks, global gotos in/out side exception blocks are not allowed }
                     if exceptionblock>0 then
@@ -2212,7 +2212,7 @@ implementation
                       CGMessage1(cg_e_goto_label_not_found,labelsym.realname);
                   end
                 else
-                  CGMessage(cg_e_interprocedural_goto_only_to_outer_scope_allowed);
+                  CGMessagePos(self.fileinfo,cg_e_interprocedural_goto_only_to_outer_scope_allowed);
               end
             else
               CGMessage1(cg_e_goto_label_not_found,labelsym.realname);

+ 2 - 0
compiler/options.pas

@@ -1700,6 +1700,8 @@ begin
                          frameworksearchpath.AddPath(More,true)
                      else
                        IllegalPara(opt);
+                 'F' :
+                   RCForceFPCRes:=true;
                  'i' :
                    begin
                      if ispara then

+ 3 - 0
compiler/rescmn.pas

@@ -65,6 +65,9 @@ uses
              resflags : [res_external_file];
           );
 
+      FPCResRCArgs = '--include $INC -of res -D FPC -o $RES $RC';
+      FPCResUtil   = 'fpcres';
+
 
 implementation
 

+ 0 - 39
packages/fcl-base/examples/dbugsrv.pp

@@ -1,39 +0,0 @@
-program dbugsrv;
-
-{$MODE OBJFPC}
-{$H+}
-{$APPTYPE CONSOLE}
-
-uses
-  classes,SysUtils,simpleipc,dbugmsg;
-
-Var
-  Srv : TSimpleIPCServer;
-  S : String;
-  Msg : TDebugMessage;
-  
-begin
-  Srv:=TSimpleIPCServer.Create(Nil);
-  Try
-    Srv.ServerID:=DebugServerID;
-    Srv.Global:=True;
-    Srv.Active:=True;
-    Srv.StartServer;
-    Writeln('Server started. Listening for debug messages');
-    Repeat
-      If Srv.PeekMessage(1,True) then
-        begin
-        Srv.MsgData.Seek(0,soFrombeginning);
-        ReadDebugMessageFromStream(Srv.MsgData,MSg);
-        Write(FormatDateTime('hh:nn:ss.zzz',Msg.MsgTimeStamp),': ');
-        Write(DebugMessageName(MSg.MsgType):12,' ');
-        Writeln(Msg.Msg);
-        end
-      else
-        Sleep(10);
-    Until False;
-  Finally
-    Srv.Free;
-  end;
-end.
-

+ 0 - 6
packages/fcl-base/fpmake.pp

@@ -19,7 +19,6 @@ begin
 {$endif ALLPACKAGES}
     P.Version:='3.3.1';
     P.Dependencies.Add('univint',[Darwin,iPhoneSim,ios]);
-    P.Dependencies.Add('fcl-res');
     p.Dependencies.Add('rtl-objpas');
 
     P.Author := '<various>';
@@ -120,8 +119,6 @@ begin
     T:=P.Targets.AddUnit('fpexprpars.pp');
       T.ResourceStrings:=true;
 
-    T:=P.Targets.AddUnit('fileinfo.pp');
-      T.ResourceStrings:=true;
     T:=P.Targets.AddUnit('csvreadwrite.pp');
     T:=P.Targets.addUnit('csvdocument.pp');
     With T.Dependencies do
@@ -166,7 +163,6 @@ begin
       T:=P.Targets.AddExampleProgram('poolmm1.pp');
       T:=P.Targets.AddExampleProgram('poolmm2.pp');
       T:=P.Targets.AddExampleProgram('restest.pp');
-      T:=P.Targets.AddExampleProgram('showver.pp');
       T:=P.Targets.AddExampleProgram('sockcli.pp');
       T:=P.Targets.AddExampleProgram('socksvr.pp');
       T:=P.Targets.AddExampleProgram('sstream.pp');
@@ -208,8 +204,6 @@ begin
       // README
       // kword.xml
       // overview.rtf
-      // showver.rc
-      // showver.res
       // simple.xml
       // parser.dat
       // testcgi.html

+ 1 - 1
packages/fcl-base/src/fpexprpars.pp

@@ -896,7 +896,7 @@ Resourcestring
   SErrCaseLabelNotAConst = 'Case label %d "%s" is not a constant expression';
   SErrCaseLabelType = 'Case label %d "%s" needs type %s, but has type %s';
   SErrCaseValueType = 'Case value %d "%s" needs type %s, but has type %s';
-  SErrDivisionByZero = '%d division by zero';
+  SErrDivisionByZero = '%s division by zero';
 
 { ---------------------------------------------------------------------
   Auxiliary functions

+ 0 - 0
packages/fcl-base/examples/showver.pp → packages/fcl-extra/examples/showver.pp


+ 0 - 0
packages/fcl-base/examples/showver.rc → packages/fcl-extra/examples/showver.rc


+ 0 - 0
packages/fcl-base/examples/showver.res → packages/fcl-extra/examples/showver.res


+ 12 - 0
packages/fcl-extra/fpmake.pp

@@ -19,6 +19,7 @@ begin
 {$endif ALLPACKAGES}
     P.Version:='3.3.1';
     P.Dependencies.Add('fcl-base');
+    P.Dependencies.Add('fcl-res');
     P.OSes:=[Win32,Win64]+AllUnixOSes;
     if Defaults.CPU=jvm then
       P.OSes := P.OSes - [java,android];
@@ -47,10 +48,21 @@ begin
         end;
       T.ResourceStrings:=true;
 
+    T:=P.Targets.AddUnit('fileinfo.pp');
+      T.ResourceStrings:=true;
+
     // Windows units
     T:=P.Targets.AddUnit('ServiceManager.pas',[Win32,Win64]);
       T.ResourceStrings:=true;
 
+    // Examples
+    P.ExamplePath.Add('examples');
+      T:=P.Targets.AddExampleProgram('showver.pp');
+
+    // example data files.
+    // showver.rc
+    // showver.res
+
 {$ifndef ALLPACKAGES}
     Run;
     end;

+ 0 - 0
packages/fcl-base/src/fileinfo.pp → packages/fcl-extra/src/fileinfo.pp


+ 3 - 1
packages/fcl-passrc/src/paswrite.pp

@@ -923,7 +923,9 @@ begin
   // delphi compatible order for example: procedure foo; reintroduce; overload; static;
   if not IsImpl and AProc.IsReintroduced then
     Add(' reintroduce;');
-  if AProc.IsOverload and (Not FInImplementation) then
+  // if NamePrefix is not empty, we're writing a dummy for external class methods.
+  // In that case, we must not write the 'overload'.
+  if AProc.IsOverload and (NamePrefix='') then
     Add(' overload;');
   if not IsImpl then
     begin

+ 142 - 0
packages/fcl-process/examples/dbugsrv.pp

@@ -0,0 +1,142 @@
+{
+  Make sure to set your project's options with, CompilerOptions --> Target "-o" -->Filename Value="fpcdebugserver",
+  i.e. the executable name must be the same as the client's const named dbugmsg.DebugServerID.
+}
+
+program dbugsrv;
+
+{$MODE OBJFPC}
+{$H+}
+{$APPTYPE CONSOLE}
+
+
+uses
+  classes,SysUtils,simpleipc,dbugmsg,strutils;
+
+
+Type
+
+  { THelperToWrite }
+
+  THelperToWrite = class
+    private
+      Class var StrLogFilename: string;
+      Class procedure WriteLnAllParams;
+      Class procedure InitParamsDependencies;
+      { methods which override standard Write and WriteLn of the console output }
+      Class procedure DoWrite(const aBuffer: string);
+      Class procedure DoWrite(var aBuffer: string; const aMinimumFieldWidthIndent: integer); overload;
+      Class procedure DoWriteLn(const aBuffer: string);
+      { methods which write in a log file, too }
+      Class procedure WriteNowThisLineInLog(aBuffer: string);
+      Class procedure WriteLnNowThisLineInLog(aBuffer: string);
+      Class function ReplaceSpecialCharsInLog(const aBuffer: string): string;
+    public
+    end;
+
+
+Var
+  Srv : TSimpleIPCServer;
+  Msg : TDebugMessage;
+  StrBuffer : string = '';
+  ObjFileStream : TFileStream = Nil;
+  
+
+class procedure THelperToWrite.WriteLnAllParams;
+Var
+  iNumParam: integer;
+  sBuffer: string;
+begin
+  sBuffer := 'ParamCount='+IntToStr(ParamCount)+LineEnding;
+  for iNumParam := 0 to ParamCount do
+    sBuffer := IfThen(iNumParam<>ParamCount, sBuffer+'ParamStr('+IntToStr(iNumParam)+') = "'+ParamStr(iNumParam)+'"'+LineEnding, sBuffer+'ParamStr('+IntToStr(iNumParam)+') = "'+ParamStr(iNumParam)+'"');
+  THelperToWrite.DoWriteLn(sBuffer);
+end;
+
+class procedure THelperToWrite.InitParamsDependencies;
+begin
+  If (ParamCount<>0) then
+    if ParamStr(1)<>'' then begin {ord. params: 1st is a log filename}
+      THelperToWrite.StrLogFilename:= ParamStr(1);
+      ObjFileStream:= TFileStream.Create(THelperToWrite.StrLogFilename, fmCreate or fmOpenWrite or fmShareDenyWrite);
+      ObjFileStream.Position:= 0;
+    end;
+end;
+
+class procedure THelperToWrite.DoWrite(const aBuffer: string);
+begin
+  Write(aBuffer);
+  if Assigned(ObjFileStream) then THelperToWrite.WriteNowThisLineInLog(StrBuffer);
+end;
+
+class procedure THelperToWrite.DoWrite(var aBuffer: string; const aMinimumFieldWidthIndent: integer);
+begin
+  Write(aBuffer:aMinimumFieldWidthIndent,' ');
+  if Assigned(ObjFileStream) then THelperToWrite.WriteNowThisLineInLog(StrBuffer);
+end;
+
+class procedure THelperToWrite.DoWriteLn(const aBuffer: string);
+begin
+  WriteLn(aBuffer);
+  if Assigned(ObjFileStream) then THelperToWrite.WriteLnNowThisLineInLog(aBuffer+LineEnding)
+end;
+
+class procedure THelperToWrite.WriteNowThisLineInLog(aBuffer: string);
+var
+  sBuffer: string;
+begin
+  sBuffer:= THelperToWrite.ReplaceSpecialCharsInLog(aBuffer);
+  ObjFileStream.Write(sBuffer[1],length(sBuffer));
+end;
+
+class procedure THelperToWrite.WriteLnNowThisLineInLog(aBuffer: string);
+var
+  sBuffer: string;
+begin
+  aBuffer:= ' '{sep. each field of the msg-record}+aBuffer+LineEnding;
+  sBuffer:= THelperToWrite.ReplaceSpecialCharsInLog(aBuffer);
+  ObjFileStream.Write(sBuffer[1],length(sBuffer));
+end;
+
+class function THelperToWrite.ReplaceSpecialCharsInLog(const aBuffer: string): string;
+begin
+  Result := StringsReplace(aBuffer, [LineEnding+LineEnding], [LineEnding], [rfReplaceAll]);
+end;
+
+ResourceString
+  SWelcomeOnSrv = 'IPC server started. Listening for debug messages:';
+
+
+begin
+  Srv:=TSimpleIPCServer.Create(Nil);
+  Try
+    Srv.ServerID:=DebugServerID;
+    Srv.Global:=True;
+    Srv.Active:=True;
+    Srv.StartServer;
+    THelperToWrite.InitParamsDependencies;
+    THelperToWrite.WriteLnAllParams;
+    StrBuffer:=SWelcomeOnSrv;
+    THelperToWrite.DoWriteLn(StrBuffer);
+    Repeat
+      If Srv.PeekMessage(1,True) then
+        begin
+        Srv.MsgData.Seek(0,soFrombeginning);
+        ReadDebugMessageFromStream(Srv.MsgData,MSg);
+        StrBuffer:=FormatDateTime('hh:nn:ss.zzz',Msg.MsgTimeStamp)+': ';
+        THelperToWrite.DoWrite(StrBuffer);
+        StrBuffer:=DebugMessageName(MSg.MsgType);
+        THelperToWrite.DoWrite(StrBuffer,12);
+        StrBuffer:=Msg.Msg;
+        THelperToWrite.DoWriteLn(StrBuffer);
+        end
+      else
+        Sleep(10);
+    Until False;
+  Finally
+    if Assigned(ObjFileStream) then
+       ObjFileStream.Free;
+    Srv.Free;
+  end;
+end.
+

+ 30 - 24
packages/fcl-process/src/dbugintf.pp

@@ -19,8 +19,11 @@ unit dbugintf;
 
 interface
 
+uses dbugmsg;
+
 Type
   TDebugLevel = (dlInformation,dlWarning,dlError);
+  TErrorLevel = Array[TDebugLevel] of integer;
 
 procedure SendBoolean(const Identifier: string; const Value: Boolean);
 procedure SendDateTime(const Identifier: string; const Value: TDateTime);
@@ -39,34 +42,33 @@ function GetDebuggingEnabled : Boolean;
 
 { low-level routines }
 
-Function  StartDebugServer : integer;
+Function StartDebugServer(const aLogFilename : String = '') : integer;
 Function InitDebugClient : Boolean;
-Function InitDebugClient(const ShowOrNotPID: Boolean) : Boolean; overload;
+function InitDebugClient(const ShowPID: Boolean; const ServerLogFilename: String = ''): Boolean;
+procedure FreeDebugClient;
 
-Const
-  SendError       : String = '';
-  DefaultDebugServer = 'debugserver';
- 
 ResourceString
-  SProcessID = 'Process %s (PID=%d)';
+  SProcessID = '%d Process %s (PID=%d)';
   SEntering = '> Entering ';
   SExiting  = '< Exiting ';
   SSeparator = '>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-<';
   SServerStartFailed = 'Failed to start debugserver. (%s)';
 
 Var
-  DebugServerExe : String = DefaultDebugServer;
+  DebugServerExe     : String = ''; { We can override this global var. in our compiled IPC client, with DefaultDebugServer a.k.a. dbugmsg.DebugServerID, or something else  }
+  DefaultDebugServer : String = DebugServerID ; { A "last ressort" simplier compiled IPC server's name, called in command line by your client a.k.a. the compiler's target file "-o" }
+  SendError          : String = '';
 
 implementation
 
 Uses 
-  SysUtils, classes,dbugmsg, process, simpleipc;
+  SysUtils, classes, process, simpleipc, strutils;
 
 Const
   DmtInformation = lctInformation;
   DmtWarning     = lctWarning;
   DmtError       = lctError;
-  ErrorLevel     : Array[TDebugLevel] of integer
+  ErrorLevel     : TErrorLevel
                  = (dmtInformation,dmtWarning,dmtError);
   IndentChars    = 2;
   
@@ -224,21 +226,23 @@ begin
   Result := not DebugDisabled;
 end;
 
-function StartDebugServer : Integer;
+function StartDebugServer(Const aLogFileName : string = '') : Integer;
 
 Var
   Cmd : string;
 
 begin
-  Cmd:=DebugServerExe;
+  Cmd := DebugServerExe;
   if Cmd='' then
-    Cmd:=DefaultDebugServer;
+    Cmd := DefaultDebugServer;
   With TProcess.Create(Nil) do
     begin
     Try
-      CommandLine:=Cmd;
+      Executable := Cmd;
+      If aLogFileName<>'' Then
+        Parameters.Add(aLogFileName);
       Execute;
-      Result:=ProcessID;
+      Result := ProcessID;
     Except On E: Exception do
       begin
       SendError := Format(SServerStartFailed,[E.Message]);
@@ -261,7 +265,7 @@ begin
       begin
       Msg.MsgType:=lctStop;
       Msg.MsgTimeStamp:=Now;
-      Msg.Msg:=Format(SProcessID,[ApplicationName, GetProcessID]);
+      Msg.Msg:=Format(SProcessID,[GetProcessID, ApplicationName, GetProcessID]);
       WriteMessage(Msg);
       end;
     if assigned(MsgBuffer) then FreeAndNil(MsgBuffer);
@@ -272,17 +276,25 @@ end;
 
 Function InitDebugClient : Boolean;
 
+begin
+  InitDebugClient(False,'');
+end;
+
+
+function InitDebugClient(const ShowPID: Boolean; const ServerLogFilename: String = ''): Boolean;
+
 Var
   msg : TDebugMessage;
   I : Integer;
 
 begin
   Result := False;
+  AlwaysDisplayPID:= ShowPID;
   DebugClient:=TSimpleIPCClient.Create(Nil);
   DebugClient.ServerID:=DebugServerID;
   If not DebugClient.ServerRunning then
     begin
-    ServerID:=StartDebugServer;
+    ServerID:=StartDebugServer(ServerLogFileName);
     if ServerID = 0 then
       begin
       DebugDisabled := True;
@@ -308,17 +320,11 @@ begin
   MsgBuffer:=TMemoryStream.Create;
   Msg.MsgType:=lctIdentify;
   Msg.MsgTimeStamp:=Now;
-  Msg.Msg:=Format(SProcessID,[ApplicationName, GetProcessID]);
+  Msg.Msg:=Format(SProcessID,[GetProcessID, ApplicationName, GetProcessID]);
   WriteMessage(Msg);
   Result := True;
 end;
 
-function InitDebugClient(const ShowOrNotPID: Boolean): Boolean;
-begin
-  AlwaysDisplayPID:= ShowOrNotPID;
-  Result:= InitDebugClient;
-end;
-
 Finalization
   FreeDebugClient;
 end.

+ 1 - 1
packages/fcl-process/src/dbugmsg.pp

@@ -22,7 +22,7 @@ interface
 uses Classes;
 
 Const
-  DebugServerID  : String = 'fpcdebugserver';
+  DebugServerID = 'fpcdebugserver'; { compiled IPC server's IDentifiant-name. Should be the same as the compiled IPC client dbugintf.DefaultDebugServer }
 
   lctStop        = -1;
   lctInformation = 0;

+ 27 - 0
packages/fcl-res/fpmake.pp

@@ -18,6 +18,9 @@ begin
     P.Directory:=ADirectory;
 {$endif ALLPACKAGES}
     P.Version:='3.3.1';
+    P.Dependencies.Add('rtl-objpas');
+    P.Dependencies.Add('fcl-base');
+    P.Dependencies.Add('tplylib');
     P.Author := 'Giulio Bernardi';
     P.License := 'LGPL with modification, ';
     P.HomepageURL := 'www.freepascal.org';
@@ -189,6 +192,30 @@ begin
           AddInclude('machosubwriter.inc');
           AddInclude('machodefaulttarget.inc');
         end;
+    T:=P.Targets.AddUnit('rcparser.pas');
+      with T.Dependencies do
+        begin
+          AddUnit('resource');
+          AddUnit('acceleratorsresource');
+          AddUnit('groupiconresource');
+          AddUnit('stringtableresource');
+          AddUnit('bitmapresource');
+          AddUnit('versionresource');
+          AddUnit('versiontypes');
+          AddUnit('groupcursorresource');
+          AddInclude('rcparserfn.inc');
+          AddInclude('rclex.inc');
+          AddInclude('yyinclude.pp');
+          AddInclude('yypreproc.pp');
+        end;
+    T:=P.Targets.AddUnit('rcreader.pp');
+      with T.Dependencies do
+        begin
+          AddUnit('resource');
+          AddUnit('resdatastream');
+          AddUnit('resfactory');
+          AddUnit('rcparser');
+        end;
     T:=P.Targets.AddUnit('resdatastream.pp');
       with T.Dependencies do
         begin

+ 1363 - 0
packages/fcl-res/src/rclex.inc

@@ -0,0 +1,1363 @@
+
+(* lexical analyzer template (TP Lex V3.0), V1.0 3-2-91 AG *)
+
+(* global definitions: *)
+var
+  kwtmp: integer;
+
+const
+  KeywordDefs: array [0..33] of TIdentMapEntry = (
+    // attribs
+    (Value: _LANGUAGE;             Name: 'LANGUAGE'),
+    (Value: _CHARACTERISTICS;      Name: 'CHARACTERISTICS'),
+    (Value: _VERSION;              Name: 'VERSION'),
+    (Value: _MOVEABLE;             Name: 'MOVEABLE'),
+    (Value: _FIXED;                Name: 'FIXED'),
+    (Value: _PURE;                 Name: 'PURE'),
+    (Value: _IMPURE;               Name: 'IMPURE'),
+    (Value: _PRELOAD;              Name: 'PRELOAD'),
+    (Value: _LOADONCALL;           Name: 'LOADONCALL'),
+    (Value: _DISCARDABLE;          Name: 'DISCARDABLE'),
+    // resource names
+    (Value: _ANICURSOR;            Name: 'ANICURSOR'),
+    (Value: _ANIICON;              Name: 'ANIICON'),
+    (Value: _BITMAP;               Name: 'BITMAP'),
+    (Value: _CURSOR;               Name: 'CURSOR'),
+    (Value: _DLGINCLUDE;           Name: 'DLGINCLUDE'),
+    (Value: _DLGINIT;              Name: 'DLGINIT'),
+    (Value: _HTML;                 Name: 'HTML'),
+    (Value: _ICON;                 Name: 'ICON'),
+    (Value: _MANIFEST;             Name: 'MANIFEST'),
+    (Value: _MESSAGETABLE;         Name: 'MESSAGETABLE'),
+    (Value: _PLUGPLAY;             Name: 'PLUGPLAY'),
+    (Value: _STRINGTABLE;          Name: 'STRINGTABLE'),
+    (Value: _RCDATA;               Name: 'RCDATA'),
+    (Value: _VERSIONINFO;          Name: 'VERSIONINFO'),
+    (Value: _VXD;                  Name: 'VXD'),
+    // file version fields names
+    (Value: _FILEVERSION;          Name: 'FILEVERSION'),
+    (Value: _PRODUCTVERSION;       Name: 'PRODUCTVERSION'),
+    (Value: _FILEFLAGSMASK;        Name: 'FILEFLAGSMASK'),
+    (Value: _FILEFLAGS;            Name: 'FILEFLAGS'),
+    (Value: _FILEOS;               Name: 'FILEOS'),
+    (Value: _FILETYPE;             Name: 'FILETYPE'),
+    (Value: _FILESUBTYPE;          Name: 'FILESUBTYPE'),
+    (Value: _BLOCK;                Name: 'BLOCK'),
+    (Value: _VALUE;                Name: 'VALUE')
+  );
+
+function KeywordToInt(k: string; out kw: integer): boolean;
+var
+  i: integer;
+begin
+  Result:= False;
+  for i:= low(KeywordDefs) to high(KeywordDefs) do begin
+    if k = KeywordDefs[i].Name then begin
+      kw:= KeywordDefs[i].Value;
+      Exit(True);
+    end;
+  end;
+end;
+
+const INCOMLINE = 2;
+const INCOMMENT = 4;
+const INSTRING = 6;
+const INSTRINGL = 8;
+
+
+
+function yylex : Integer;
+
+procedure yyaction ( yyruleno : Integer );
+  (* local definitions: *)
+
+begin
+  (* actions: *)
+  case yyruleno of
+  1:
+                        start(INCOMLINE);
+  2:
+                        begin start(0); unget_char(nl); end;
+  3:
+                        yymore;
+
+  4:
+                        start(INCOMMENT);
+  5:
+                        ;
+  6:
+                        start(0);
+  7:
+                        return(_ILLEGAL);
+
+  8:
+                        return(_NUMBER);
+  9:
+                        return(_NUMBER);
+  10:
+                        return(_NUMBER);
+  11:
+                                  begin start(INSTRINGL); strbuf_begin(); end;
+  12:
+                                  begin start(INSTRING); strbuf_begin(); end;
+  13:
+                                  strbuf_append('"');
+  14:
+                                  begin
+                                    start(0);
+                                    return(_QUOTEDSTR);
+                                  end;
+  15:
+                                  begin
+                                    start(0);
+                                    return(_QUOTEDSTRL);
+                                  end;
+  16:
+                                  ;
+  17:
+                                  return(_ILLEGAL);
+  18:
+                                  strbuf_append(yytext);
+  19:
+                        begin yytext:= 'StringFileInfo'; return(_STR_StringFileInfo); end;
+  20:
+                        begin yytext:= 'VarFileInfo'; return(_STR_VarFileInfo); end;
+  21:
+                        begin yytext:= 'Translation'; return(_STR_Translation); end;
+
+  22:
+                        return(_BEGIN);
+  23:
+                        return(_END);
+  24:
+                        begin
+                          if ypreproc.isdefine(yytext) then begin
+                            unget_char(' ');
+                            unget_string(ypreproc.getdefine(yytext));
+                          end else
+                            if KeywordToInt(yytext, kwtmp) then
+                              return(kwtmp)
+                            else
+                              return(_ID);
+                         end;
+  25:
+                        ;
+  26:
+                        returnc(yytext[1]);
+  27:
+                        return(_ILLEGAL);
+  end;
+end(*yyaction*);
+
+(* DFA table: *)
+
+type YYTRec = record
+                cc : set of Char;
+                s  : Integer;
+              end;
+
+const
+
+yynmarks   = 62;
+yynmatches = 62;
+yyntrans   = 131;
+yynstates  = 94;
+
+yyk : array [1..yynmarks] of Integer = (
+  { 0: }
+  { 1: }
+  { 2: }
+  { 3: }
+  { 4: }
+  { 5: }
+  { 6: }
+  { 7: }
+  { 8: }
+  { 9: }
+  { 10: }
+  26,
+  27,
+  { 11: }
+  8,
+  27,
+  { 12: }
+  8,
+  27,
+  { 13: }
+  24,
+  27,
+  { 14: }
+  12,
+  27,
+  { 15: }
+  24,
+  27,
+  { 16: }
+  22,
+  27,
+  { 17: }
+  24,
+  27,
+  { 18: }
+  23,
+  27,
+  { 19: }
+  24,
+  27,
+  { 20: }
+  25,
+  { 21: }
+  26,
+  27,
+  { 22: }
+  25,
+  27,
+  { 23: }
+  27,
+  { 24: }
+  2,
+  { 25: }
+  3,
+  { 26: }
+  5,
+  { 27: }
+  5,
+  { 28: }
+  7,
+  { 29: }
+  14,
+  18,
+  { 30: }
+  18,
+  { 31: }
+  17,
+  { 32: }
+  18,
+  { 33: }
+  15,
+  18,
+  { 34: }
+  1,
+  { 35: }
+  4,
+  { 36: }
+  8,
+  { 37: }
+  8,
+  { 38: }
+  { 39: }
+  { 40: }
+  11,
+  { 41: }
+  24,
+  { 42: }
+  { 43: }
+  { 44: }
+  { 45: }
+  24,
+  { 46: }
+  24,
+  { 47: }
+  6,
+  { 48: }
+  13,
+  { 49: }
+  16,
+  { 50: }
+  9,
+  { 51: }
+  10,
+  { 52: }
+  { 53: }
+  24,
+  { 54: }
+  23,
+  24,
+  { 55: }
+  9,
+  { 56: }
+  10,
+  { 57: }
+  { 58: }
+  { 59: }
+  { 60: }
+  24,
+  { 61: }
+  { 62: }
+  22,
+  24,
+  { 63: }
+  { 64: }
+  { 65: }
+  { 66: }
+  { 67: }
+  { 68: }
+  { 69: }
+  { 70: }
+  { 71: }
+  { 72: }
+  20,
+  { 73: }
+  21,
+  { 74: }
+  19
+  { 75: }
+  { 76: }
+  { 77: }
+  { 78: }
+  { 79: }
+  { 80: }
+  { 81: }
+  { 82: }
+  { 83: }
+  { 84: }
+  { 85: }
+  { 86: }
+  { 87: }
+  { 88: }
+  { 89: }
+  { 90: }
+  { 91: }
+  { 92: }
+  { 93: }
+);
+
+yym : array [1..yynmatches] of Integer = (
+{ 0: }
+{ 1: }
+{ 2: }
+{ 3: }
+{ 4: }
+{ 5: }
+{ 6: }
+{ 7: }
+{ 8: }
+{ 9: }
+{ 10: }
+  26,
+  27,
+{ 11: }
+  8,
+  27,
+{ 12: }
+  8,
+  27,
+{ 13: }
+  24,
+  27,
+{ 14: }
+  12,
+  27,
+{ 15: }
+  24,
+  27,
+{ 16: }
+  22,
+  27,
+{ 17: }
+  24,
+  27,
+{ 18: }
+  23,
+  27,
+{ 19: }
+  24,
+  27,
+{ 20: }
+  25,
+{ 21: }
+  26,
+  27,
+{ 22: }
+  25,
+  27,
+{ 23: }
+  27,
+{ 24: }
+  2,
+{ 25: }
+  3,
+{ 26: }
+  5,
+{ 27: }
+  5,
+{ 28: }
+  7,
+{ 29: }
+  14,
+  18,
+{ 30: }
+  18,
+{ 31: }
+  17,
+{ 32: }
+  18,
+{ 33: }
+  15,
+  18,
+{ 34: }
+  1,
+{ 35: }
+  4,
+{ 36: }
+  8,
+{ 37: }
+  8,
+{ 38: }
+{ 39: }
+{ 40: }
+  11,
+{ 41: }
+  24,
+{ 42: }
+{ 43: }
+{ 44: }
+{ 45: }
+  24,
+{ 46: }
+  24,
+{ 47: }
+  6,
+{ 48: }
+  13,
+{ 49: }
+  16,
+{ 50: }
+  9,
+{ 51: }
+  10,
+{ 52: }
+{ 53: }
+  24,
+{ 54: }
+  23,
+  24,
+{ 55: }
+  9,
+{ 56: }
+  10,
+{ 57: }
+{ 58: }
+{ 59: }
+{ 60: }
+  24,
+{ 61: }
+{ 62: }
+  22,
+  24,
+{ 63: }
+{ 64: }
+{ 65: }
+{ 66: }
+{ 67: }
+{ 68: }
+{ 69: }
+{ 70: }
+{ 71: }
+{ 72: }
+  20,
+{ 73: }
+  21,
+{ 74: }
+  19
+{ 75: }
+{ 76: }
+{ 77: }
+{ 78: }
+{ 79: }
+{ 80: }
+{ 81: }
+{ 82: }
+{ 83: }
+{ 84: }
+{ 85: }
+{ 86: }
+{ 87: }
+{ 88: }
+{ 89: }
+{ 90: }
+{ 91: }
+{ 92: }
+{ 93: }
+);
+
+yyt : array [1..yyntrans] of YYTrec = (
+{ 0: }
+  ( cc: [ #1..#8,#11,#13..#31,'!','#','$','''','*','+',
+            '-','.',':'..'@','['..']','`',#127..#255 ]; s: 23),
+  ( cc: [ #9,#12,' ' ]; s: 22),
+  ( cc: [ #10 ]; s: 20),
+  ( cc: [ '"' ]; s: 14),
+  ( cc: [ '%','&','(',')',',','^','|','~' ]; s: 21),
+  ( cc: [ '/' ]; s: 10),
+  ( cc: [ '0' ]; s: 12),
+  ( cc: [ '1'..'9' ]; s: 11),
+  ( cc: [ 'A','C','D','F'..'K','M'..'Z','_','a'..'z' ]; s: 19),
+  ( cc: [ 'B' ]; s: 15),
+  ( cc: [ 'E' ]; s: 17),
+  ( cc: [ 'L' ]; s: 13),
+  ( cc: [ '{' ]; s: 16),
+  ( cc: [ '}' ]; s: 18),
+{ 1: }
+  ( cc: [ #1..#8,#11,#13..#31,'!','#','$','''','*','+',
+            '-','.',':'..'@','['..']','`',#127..#255 ]; s: 23),
+  ( cc: [ #9,#12,' ' ]; s: 22),
+  ( cc: [ #10 ]; s: 20),
+  ( cc: [ '"' ]; s: 14),
+  ( cc: [ '%','&','(',')',',','^','|','~' ]; s: 21),
+  ( cc: [ '/' ]; s: 10),
+  ( cc: [ '0' ]; s: 12),
+  ( cc: [ '1'..'9' ]; s: 11),
+  ( cc: [ 'A','C','D','F'..'K','M'..'Z','_','a'..'z' ]; s: 19),
+  ( cc: [ 'B' ]; s: 15),
+  ( cc: [ 'E' ]; s: 17),
+  ( cc: [ 'L' ]; s: 13),
+  ( cc: [ '{' ]; s: 16),
+  ( cc: [ '}' ]; s: 18),
+{ 2: }
+  ( cc: [ #1..#9,#11..#255 ]; s: 25),
+  ( cc: [ #10 ]; s: 24),
+{ 3: }
+  ( cc: [ #1..#9,#11..#255 ]; s: 25),
+  ( cc: [ #10 ]; s: 24),
+{ 4: }
+  ( cc: [ #0 ]; s: 28),
+  ( cc: [ #1..#9,#11..')','+'..#255 ]; s: 26),
+  ( cc: [ '*' ]; s: 27),
+{ 5: }
+  ( cc: [ #0 ]; s: 28),
+  ( cc: [ #1..#9,#11..')','+'..#255 ]; s: 26),
+  ( cc: [ '*' ]; s: 27),
+{ 6: }
+  ( cc: [ #1..#9,#11..'!','#'..'[',']'..#255 ]; s: 32),
+  ( cc: [ #10 ]; s: 31),
+  ( cc: [ '"' ]; s: 29),
+  ( cc: [ '\' ]; s: 30),
+{ 7: }
+  ( cc: [ #1..#9,#11..'!','#'..'[',']'..#255 ]; s: 32),
+  ( cc: [ #10 ]; s: 31),
+  ( cc: [ '"' ]; s: 29),
+  ( cc: [ '\' ]; s: 30),
+{ 8: }
+  ( cc: [ #1..#9,#11..'!','#'..'[',']'..#255 ]; s: 32),
+  ( cc: [ #10 ]; s: 31),
+  ( cc: [ '"' ]; s: 33),
+  ( cc: [ '\' ]; s: 30),
+{ 9: }
+  ( cc: [ #1..#9,#11..'!','#'..'[',']'..#255 ]; s: 32),
+  ( cc: [ #10 ]; s: 31),
+  ( cc: [ '"' ]; s: 33),
+  ( cc: [ '\' ]; s: 30),
+{ 10: }
+  ( cc: [ '*' ]; s: 35),
+  ( cc: [ '/' ]; s: 34),
+{ 11: }
+  ( cc: [ '0'..'9' ]; s: 36),
+  ( cc: [ 'L' ]; s: 37),
+{ 12: }
+  ( cc: [ '0'..'9' ]; s: 36),
+  ( cc: [ 'L' ]; s: 37),
+  ( cc: [ 'o' ]; s: 39),
+  ( cc: [ 'x' ]; s: 38),
+{ 13: }
+  ( cc: [ '"' ]; s: 40),
+  ( cc: [ '0'..'9','A'..'Z','_','a'..'z' ]; s: 41),
+{ 14: }
+  ( cc: [ 'S' ]; s: 42),
+  ( cc: [ 'T' ]; s: 44),
+  ( cc: [ 'V' ]; s: 43),
+{ 15: }
+  ( cc: [ '0'..'9','A'..'D','F'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'E' ]; s: 45),
+{ 16: }
+{ 17: }
+  ( cc: [ '0'..'9','A'..'M','O'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'N' ]; s: 46),
+{ 18: }
+{ 19: }
+  ( cc: [ '0'..'9','A'..'Z','_','a'..'z' ]; s: 41),
+{ 20: }
+{ 21: }
+{ 22: }
+{ 23: }
+{ 24: }
+{ 25: }
+{ 26: }
+{ 27: }
+  ( cc: [ '/' ]; s: 47),
+{ 28: }
+{ 29: }
+  ( cc: [ '"' ]; s: 48),
+{ 30: }
+  ( cc: [ #10 ]; s: 49),
+{ 31: }
+{ 32: }
+{ 33: }
+  ( cc: [ '"' ]; s: 48),
+{ 34: }
+{ 35: }
+{ 36: }
+  ( cc: [ '0'..'9' ]; s: 36),
+  ( cc: [ 'L' ]; s: 37),
+{ 37: }
+{ 38: }
+  ( cc: [ '0'..'9','A'..'F','a'..'f' ]; s: 50),
+{ 39: }
+  ( cc: [ '0'..'7' ]; s: 51),
+{ 40: }
+{ 41: }
+  ( cc: [ '0'..'9','A'..'Z','_','a'..'z' ]; s: 41),
+{ 42: }
+  ( cc: [ 't' ]; s: 52),
+{ 43: }
+  ( cc: [ 'a' ]; s: 77),
+{ 44: }
+  ( cc: [ 'r' ]; s: 76),
+{ 45: }
+  ( cc: [ '0'..'9','A'..'F','H'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'G' ]; s: 53),
+{ 46: }
+  ( cc: [ '0'..'9','A'..'C','E'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'D' ]; s: 54),
+{ 47: }
+{ 48: }
+{ 49: }
+{ 50: }
+  ( cc: [ '0'..'9','A'..'F','a'..'f' ]; s: 50),
+  ( cc: [ 'L' ]; s: 55),
+{ 51: }
+  ( cc: [ '0'..'7' ]; s: 51),
+  ( cc: [ 'L' ]; s: 56),
+{ 52: }
+  ( cc: [ 'r' ]; s: 57),
+{ 53: }
+  ( cc: [ '0'..'9','A'..'H','J'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'I' ]; s: 60),
+{ 54: }
+  ( cc: [ '0'..'9','A'..'Z','_','a'..'z' ]; s: 41),
+{ 55: }
+{ 56: }
+{ 57: }
+  ( cc: [ 'i' ]; s: 79),
+{ 58: }
+  ( cc: [ 'F' ]; s: 78),
+{ 59: }
+  ( cc: [ 'n' ]; s: 61),
+{ 60: }
+  ( cc: [ '0'..'9','A'..'M','O'..'Z','_','a'..'z' ]; s: 41),
+  ( cc: [ 'N' ]; s: 62),
+{ 61: }
+  ( cc: [ 's' ]; s: 80),
+{ 62: }
+  ( cc: [ '0'..'9','A'..'Z','_','a'..'z' ]; s: 41),
+{ 63: }
+  ( cc: [ 'g' ]; s: 93),
+{ 64: }
+  ( cc: [ 'l' ]; s: 65),
+{ 65: }
+  ( cc: [ 'e' ]; s: 67),
+{ 66: }
+  ( cc: [ 'a' ]; s: 75),
+{ 67: }
+  ( cc: [ 'I' ]; s: 83),
+{ 68: }
+  ( cc: [ 'f' ]; s: 70),
+{ 69: }
+  ( cc: [ 'o' ]; s: 85),
+{ 70: }
+  ( cc: [ 'o' ]; s: 71),
+{ 71: }
+  ( cc: [ '"' ]; s: 72),
+{ 72: }
+{ 73: }
+{ 74: }
+{ 75: }
+  ( cc: [ 't' ]; s: 82),
+{ 76: }
+  ( cc: [ 'a' ]; s: 59),
+{ 77: }
+  ( cc: [ 'r' ]; s: 58),
+{ 78: }
+  ( cc: [ 'i' ]; s: 64),
+{ 79: }
+  ( cc: [ 'n' ]; s: 63),
+{ 80: }
+  ( cc: [ 'l' ]; s: 66),
+{ 81: }
+  ( cc: [ '"' ]; s: 73),
+{ 82: }
+  ( cc: [ 'i' ]; s: 69),
+{ 83: }
+  ( cc: [ 'n' ]; s: 68),
+{ 84: }
+  ( cc: [ '"' ]; s: 74),
+{ 85: }
+  ( cc: [ 'n' ]; s: 81),
+{ 86: }
+  ( cc: [ 'o' ]; s: 84),
+{ 87: }
+  ( cc: [ 'f' ]; s: 86),
+{ 88: }
+  ( cc: [ 'n' ]; s: 87),
+{ 89: }
+  ( cc: [ 'I' ]; s: 88),
+{ 90: }
+  ( cc: [ 'e' ]; s: 89),
+{ 91: }
+  ( cc: [ 'l' ]; s: 90),
+{ 92: }
+  ( cc: [ 'i' ]; s: 91),
+{ 93: }
+  ( cc: [ 'F' ]; s: 92)
+);
+
+yykl : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 1,
+{ 2: } 1,
+{ 3: } 1,
+{ 4: } 1,
+{ 5: } 1,
+{ 6: } 1,
+{ 7: } 1,
+{ 8: } 1,
+{ 9: } 1,
+{ 10: } 1,
+{ 11: } 3,
+{ 12: } 5,
+{ 13: } 7,
+{ 14: } 9,
+{ 15: } 11,
+{ 16: } 13,
+{ 17: } 15,
+{ 18: } 17,
+{ 19: } 19,
+{ 20: } 21,
+{ 21: } 22,
+{ 22: } 24,
+{ 23: } 26,
+{ 24: } 27,
+{ 25: } 28,
+{ 26: } 29,
+{ 27: } 30,
+{ 28: } 31,
+{ 29: } 32,
+{ 30: } 34,
+{ 31: } 35,
+{ 32: } 36,
+{ 33: } 37,
+{ 34: } 39,
+{ 35: } 40,
+{ 36: } 41,
+{ 37: } 42,
+{ 38: } 43,
+{ 39: } 43,
+{ 40: } 43,
+{ 41: } 44,
+{ 42: } 45,
+{ 43: } 45,
+{ 44: } 45,
+{ 45: } 45,
+{ 46: } 46,
+{ 47: } 47,
+{ 48: } 48,
+{ 49: } 49,
+{ 50: } 50,
+{ 51: } 51,
+{ 52: } 52,
+{ 53: } 52,
+{ 54: } 53,
+{ 55: } 55,
+{ 56: } 56,
+{ 57: } 57,
+{ 58: } 57,
+{ 59: } 57,
+{ 60: } 57,
+{ 61: } 58,
+{ 62: } 58,
+{ 63: } 60,
+{ 64: } 60,
+{ 65: } 60,
+{ 66: } 60,
+{ 67: } 60,
+{ 68: } 60,
+{ 69: } 60,
+{ 70: } 60,
+{ 71: } 60,
+{ 72: } 60,
+{ 73: } 61,
+{ 74: } 62,
+{ 75: } 63,
+{ 76: } 63,
+{ 77: } 63,
+{ 78: } 63,
+{ 79: } 63,
+{ 80: } 63,
+{ 81: } 63,
+{ 82: } 63,
+{ 83: } 63,
+{ 84: } 63,
+{ 85: } 63,
+{ 86: } 63,
+{ 87: } 63,
+{ 88: } 63,
+{ 89: } 63,
+{ 90: } 63,
+{ 91: } 63,
+{ 92: } 63,
+{ 93: } 63
+);
+
+yykh : array [0..yynstates-1] of Integer = (
+{ 0: } 0,
+{ 1: } 0,
+{ 2: } 0,
+{ 3: } 0,
+{ 4: } 0,
+{ 5: } 0,
+{ 6: } 0,
+{ 7: } 0,
+{ 8: } 0,
+{ 9: } 0,
+{ 10: } 2,
+{ 11: } 4,
+{ 12: } 6,
+{ 13: } 8,
+{ 14: } 10,
+{ 15: } 12,
+{ 16: } 14,
+{ 17: } 16,
+{ 18: } 18,
+{ 19: } 20,
+{ 20: } 21,
+{ 21: } 23,
+{ 22: } 25,
+{ 23: } 26,
+{ 24: } 27,
+{ 25: } 28,
+{ 26: } 29,
+{ 27: } 30,
+{ 28: } 31,
+{ 29: } 33,
+{ 30: } 34,
+{ 31: } 35,
+{ 32: } 36,
+{ 33: } 38,
+{ 34: } 39,
+{ 35: } 40,
+{ 36: } 41,
+{ 37: } 42,
+{ 38: } 42,
+{ 39: } 42,
+{ 40: } 43,
+{ 41: } 44,
+{ 42: } 44,
+{ 43: } 44,
+{ 44: } 44,
+{ 45: } 45,
+{ 46: } 46,
+{ 47: } 47,
+{ 48: } 48,
+{ 49: } 49,
+{ 50: } 50,
+{ 51: } 51,
+{ 52: } 51,
+{ 53: } 52,
+{ 54: } 54,
+{ 55: } 55,
+{ 56: } 56,
+{ 57: } 56,
+{ 58: } 56,
+{ 59: } 56,
+{ 60: } 57,
+{ 61: } 57,
+{ 62: } 59,
+{ 63: } 59,
+{ 64: } 59,
+{ 65: } 59,
+{ 66: } 59,
+{ 67: } 59,
+{ 68: } 59,
+{ 69: } 59,
+{ 70: } 59,
+{ 71: } 59,
+{ 72: } 60,
+{ 73: } 61,
+{ 74: } 62,
+{ 75: } 62,
+{ 76: } 62,
+{ 77: } 62,
+{ 78: } 62,
+{ 79: } 62,
+{ 80: } 62,
+{ 81: } 62,
+{ 82: } 62,
+{ 83: } 62,
+{ 84: } 62,
+{ 85: } 62,
+{ 86: } 62,
+{ 87: } 62,
+{ 88: } 62,
+{ 89: } 62,
+{ 90: } 62,
+{ 91: } 62,
+{ 92: } 62,
+{ 93: } 62
+);
+
+yyml : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 1,
+{ 2: } 1,
+{ 3: } 1,
+{ 4: } 1,
+{ 5: } 1,
+{ 6: } 1,
+{ 7: } 1,
+{ 8: } 1,
+{ 9: } 1,
+{ 10: } 1,
+{ 11: } 3,
+{ 12: } 5,
+{ 13: } 7,
+{ 14: } 9,
+{ 15: } 11,
+{ 16: } 13,
+{ 17: } 15,
+{ 18: } 17,
+{ 19: } 19,
+{ 20: } 21,
+{ 21: } 22,
+{ 22: } 24,
+{ 23: } 26,
+{ 24: } 27,
+{ 25: } 28,
+{ 26: } 29,
+{ 27: } 30,
+{ 28: } 31,
+{ 29: } 32,
+{ 30: } 34,
+{ 31: } 35,
+{ 32: } 36,
+{ 33: } 37,
+{ 34: } 39,
+{ 35: } 40,
+{ 36: } 41,
+{ 37: } 42,
+{ 38: } 43,
+{ 39: } 43,
+{ 40: } 43,
+{ 41: } 44,
+{ 42: } 45,
+{ 43: } 45,
+{ 44: } 45,
+{ 45: } 45,
+{ 46: } 46,
+{ 47: } 47,
+{ 48: } 48,
+{ 49: } 49,
+{ 50: } 50,
+{ 51: } 51,
+{ 52: } 52,
+{ 53: } 52,
+{ 54: } 53,
+{ 55: } 55,
+{ 56: } 56,
+{ 57: } 57,
+{ 58: } 57,
+{ 59: } 57,
+{ 60: } 57,
+{ 61: } 58,
+{ 62: } 58,
+{ 63: } 60,
+{ 64: } 60,
+{ 65: } 60,
+{ 66: } 60,
+{ 67: } 60,
+{ 68: } 60,
+{ 69: } 60,
+{ 70: } 60,
+{ 71: } 60,
+{ 72: } 60,
+{ 73: } 61,
+{ 74: } 62,
+{ 75: } 63,
+{ 76: } 63,
+{ 77: } 63,
+{ 78: } 63,
+{ 79: } 63,
+{ 80: } 63,
+{ 81: } 63,
+{ 82: } 63,
+{ 83: } 63,
+{ 84: } 63,
+{ 85: } 63,
+{ 86: } 63,
+{ 87: } 63,
+{ 88: } 63,
+{ 89: } 63,
+{ 90: } 63,
+{ 91: } 63,
+{ 92: } 63,
+{ 93: } 63
+);
+
+yymh : array [0..yynstates-1] of Integer = (
+{ 0: } 0,
+{ 1: } 0,
+{ 2: } 0,
+{ 3: } 0,
+{ 4: } 0,
+{ 5: } 0,
+{ 6: } 0,
+{ 7: } 0,
+{ 8: } 0,
+{ 9: } 0,
+{ 10: } 2,
+{ 11: } 4,
+{ 12: } 6,
+{ 13: } 8,
+{ 14: } 10,
+{ 15: } 12,
+{ 16: } 14,
+{ 17: } 16,
+{ 18: } 18,
+{ 19: } 20,
+{ 20: } 21,
+{ 21: } 23,
+{ 22: } 25,
+{ 23: } 26,
+{ 24: } 27,
+{ 25: } 28,
+{ 26: } 29,
+{ 27: } 30,
+{ 28: } 31,
+{ 29: } 33,
+{ 30: } 34,
+{ 31: } 35,
+{ 32: } 36,
+{ 33: } 38,
+{ 34: } 39,
+{ 35: } 40,
+{ 36: } 41,
+{ 37: } 42,
+{ 38: } 42,
+{ 39: } 42,
+{ 40: } 43,
+{ 41: } 44,
+{ 42: } 44,
+{ 43: } 44,
+{ 44: } 44,
+{ 45: } 45,
+{ 46: } 46,
+{ 47: } 47,
+{ 48: } 48,
+{ 49: } 49,
+{ 50: } 50,
+{ 51: } 51,
+{ 52: } 51,
+{ 53: } 52,
+{ 54: } 54,
+{ 55: } 55,
+{ 56: } 56,
+{ 57: } 56,
+{ 58: } 56,
+{ 59: } 56,
+{ 60: } 57,
+{ 61: } 57,
+{ 62: } 59,
+{ 63: } 59,
+{ 64: } 59,
+{ 65: } 59,
+{ 66: } 59,
+{ 67: } 59,
+{ 68: } 59,
+{ 69: } 59,
+{ 70: } 59,
+{ 71: } 59,
+{ 72: } 60,
+{ 73: } 61,
+{ 74: } 62,
+{ 75: } 62,
+{ 76: } 62,
+{ 77: } 62,
+{ 78: } 62,
+{ 79: } 62,
+{ 80: } 62,
+{ 81: } 62,
+{ 82: } 62,
+{ 83: } 62,
+{ 84: } 62,
+{ 85: } 62,
+{ 86: } 62,
+{ 87: } 62,
+{ 88: } 62,
+{ 89: } 62,
+{ 90: } 62,
+{ 91: } 62,
+{ 92: } 62,
+{ 93: } 62
+);
+
+yytl : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 15,
+{ 2: } 29,
+{ 3: } 31,
+{ 4: } 33,
+{ 5: } 36,
+{ 6: } 39,
+{ 7: } 43,
+{ 8: } 47,
+{ 9: } 51,
+{ 10: } 55,
+{ 11: } 57,
+{ 12: } 59,
+{ 13: } 63,
+{ 14: } 65,
+{ 15: } 68,
+{ 16: } 70,
+{ 17: } 70,
+{ 18: } 72,
+{ 19: } 72,
+{ 20: } 73,
+{ 21: } 73,
+{ 22: } 73,
+{ 23: } 73,
+{ 24: } 73,
+{ 25: } 73,
+{ 26: } 73,
+{ 27: } 73,
+{ 28: } 74,
+{ 29: } 74,
+{ 30: } 75,
+{ 31: } 76,
+{ 32: } 76,
+{ 33: } 76,
+{ 34: } 77,
+{ 35: } 77,
+{ 36: } 77,
+{ 37: } 79,
+{ 38: } 79,
+{ 39: } 80,
+{ 40: } 81,
+{ 41: } 81,
+{ 42: } 82,
+{ 43: } 83,
+{ 44: } 84,
+{ 45: } 85,
+{ 46: } 87,
+{ 47: } 89,
+{ 48: } 89,
+{ 49: } 89,
+{ 50: } 89,
+{ 51: } 91,
+{ 52: } 93,
+{ 53: } 94,
+{ 54: } 96,
+{ 55: } 97,
+{ 56: } 97,
+{ 57: } 97,
+{ 58: } 98,
+{ 59: } 99,
+{ 60: } 100,
+{ 61: } 102,
+{ 62: } 103,
+{ 63: } 104,
+{ 64: } 105,
+{ 65: } 106,
+{ 66: } 107,
+{ 67: } 108,
+{ 68: } 109,
+{ 69: } 110,
+{ 70: } 111,
+{ 71: } 112,
+{ 72: } 113,
+{ 73: } 113,
+{ 74: } 113,
+{ 75: } 113,
+{ 76: } 114,
+{ 77: } 115,
+{ 78: } 116,
+{ 79: } 117,
+{ 80: } 118,
+{ 81: } 119,
+{ 82: } 120,
+{ 83: } 121,
+{ 84: } 122,
+{ 85: } 123,
+{ 86: } 124,
+{ 87: } 125,
+{ 88: } 126,
+{ 89: } 127,
+{ 90: } 128,
+{ 91: } 129,
+{ 92: } 130,
+{ 93: } 131
+);
+
+yyth : array [0..yynstates-1] of Integer = (
+{ 0: } 14,
+{ 1: } 28,
+{ 2: } 30,
+{ 3: } 32,
+{ 4: } 35,
+{ 5: } 38,
+{ 6: } 42,
+{ 7: } 46,
+{ 8: } 50,
+{ 9: } 54,
+{ 10: } 56,
+{ 11: } 58,
+{ 12: } 62,
+{ 13: } 64,
+{ 14: } 67,
+{ 15: } 69,
+{ 16: } 69,
+{ 17: } 71,
+{ 18: } 71,
+{ 19: } 72,
+{ 20: } 72,
+{ 21: } 72,
+{ 22: } 72,
+{ 23: } 72,
+{ 24: } 72,
+{ 25: } 72,
+{ 26: } 72,
+{ 27: } 73,
+{ 28: } 73,
+{ 29: } 74,
+{ 30: } 75,
+{ 31: } 75,
+{ 32: } 75,
+{ 33: } 76,
+{ 34: } 76,
+{ 35: } 76,
+{ 36: } 78,
+{ 37: } 78,
+{ 38: } 79,
+{ 39: } 80,
+{ 40: } 80,
+{ 41: } 81,
+{ 42: } 82,
+{ 43: } 83,
+{ 44: } 84,
+{ 45: } 86,
+{ 46: } 88,
+{ 47: } 88,
+{ 48: } 88,
+{ 49: } 88,
+{ 50: } 90,
+{ 51: } 92,
+{ 52: } 93,
+{ 53: } 95,
+{ 54: } 96,
+{ 55: } 96,
+{ 56: } 96,
+{ 57: } 97,
+{ 58: } 98,
+{ 59: } 99,
+{ 60: } 101,
+{ 61: } 102,
+{ 62: } 103,
+{ 63: } 104,
+{ 64: } 105,
+{ 65: } 106,
+{ 66: } 107,
+{ 67: } 108,
+{ 68: } 109,
+{ 69: } 110,
+{ 70: } 111,
+{ 71: } 112,
+{ 72: } 112,
+{ 73: } 112,
+{ 74: } 112,
+{ 75: } 113,
+{ 76: } 114,
+{ 77: } 115,
+{ 78: } 116,
+{ 79: } 117,
+{ 80: } 118,
+{ 81: } 119,
+{ 82: } 120,
+{ 83: } 121,
+{ 84: } 122,
+{ 85: } 123,
+{ 86: } 124,
+{ 87: } 125,
+{ 88: } 126,
+{ 89: } 127,
+{ 90: } 128,
+{ 91: } 129,
+{ 92: } 130,
+{ 93: } 131
+);
+
+
+var yyn : Integer;
+
+label start, scan, action;
+
+begin
+
+start:
+
+  (* initialize: *)
+
+  yynew;
+
+scan:
+
+  (* mark positions and matches: *)
+
+  for yyn := yykl[yystate] to     yykh[yystate] do yymark(yyk[yyn]);
+  for yyn := yymh[yystate] downto yyml[yystate] do yymatch(yym[yyn]);
+
+  if yytl[yystate]>yyth[yystate] then goto action; (* dead state *)
+
+  (* get next character: *)
+
+  yyscan;
+
+  (* determine action: *)
+
+  yyn := yytl[yystate];
+  while (yyn<=yyth[yystate]) and not (yyactchar in yyt[yyn].cc) do inc(yyn);
+  if yyn>yyth[yystate] then goto action;
+    (* no transition on yyactchar in this state *)
+
+  (* switch to new state: *)
+
+  yystate := yyt[yyn].s;
+
+  goto scan;
+
+action:
+
+  (* execute action: *)
+
+  if yyfind(yyrule) then
+    begin
+      yyaction(yyrule);
+      if yyreject then goto action;
+    end
+  else if not yydefault and yywrap() then
+    begin
+      yyclear;
+      return(0);
+    end;
+
+  if not yydone then goto start;
+
+  yylex := yyretval;
+
+end(*yylex*);
+
+
+
+// end.
+
+
+
+
+

+ 121 - 0
packages/fcl-res/src/rclex.l

@@ -0,0 +1,121 @@
+%{
+var
+  kwtmp: integer;
+
+const
+  KeywordDefs: array [0..33] of TIdentMapEntry = (
+    // attribs
+    (Value: _LANGUAGE;             Name: 'LANGUAGE'),
+    (Value: _CHARACTERISTICS;      Name: 'CHARACTERISTICS'),
+    (Value: _VERSION;              Name: 'VERSION'),
+    (Value: _MOVEABLE;             Name: 'MOVEABLE'),
+    (Value: _FIXED;                Name: 'FIXED'),
+    (Value: _PURE;                 Name: 'PURE'),
+    (Value: _IMPURE;               Name: 'IMPURE'),
+    (Value: _PRELOAD;              Name: 'PRELOAD'),
+    (Value: _LOADONCALL;           Name: 'LOADONCALL'),
+    (Value: _DISCARDABLE;          Name: 'DISCARDABLE'),
+    // resource names
+    (Value: _ANICURSOR;            Name: 'ANICURSOR'),
+    (Value: _ANIICON;              Name: 'ANIICON'),
+    (Value: _BITMAP;               Name: 'BITMAP'),
+    (Value: _CURSOR;               Name: 'CURSOR'),
+    (Value: _DLGINCLUDE;           Name: 'DLGINCLUDE'),
+    (Value: _DLGINIT;              Name: 'DLGINIT'),
+    (Value: _HTML;                 Name: 'HTML'),
+    (Value: _ICON;                 Name: 'ICON'),
+    (Value: _MANIFEST;             Name: 'MANIFEST'),
+    (Value: _MESSAGETABLE;         Name: 'MESSAGETABLE'),
+    (Value: _PLUGPLAY;             Name: 'PLUGPLAY'),
+    (Value: _STRINGTABLE;          Name: 'STRINGTABLE'),
+    (Value: _RCDATA;               Name: 'RCDATA'),
+    (Value: _VERSIONINFO;          Name: 'VERSIONINFO'),
+    (Value: _VXD;                  Name: 'VXD'),
+    // file version fields names
+    (Value: _FILEVERSION;          Name: 'FILEVERSION'),
+    (Value: _PRODUCTVERSION;       Name: 'PRODUCTVERSION'),
+    (Value: _FILEFLAGSMASK;        Name: 'FILEFLAGSMASK'),
+    (Value: _FILEFLAGS;            Name: 'FILEFLAGS'),
+    (Value: _FILEOS;               Name: 'FILEOS'),
+    (Value: _FILETYPE;             Name: 'FILETYPE'),
+    (Value: _FILESUBTYPE;          Name: 'FILESUBTYPE'),
+    (Value: _BLOCK;                Name: 'BLOCK'),
+    (Value: _VALUE;                Name: 'VALUE')
+  );
+
+function KeywordToInt(k: string; out kw: integer): boolean;
+var
+  i: integer;
+begin
+  Result:= False;
+  for i:= low(KeywordDefs) to high(KeywordDefs) do begin
+    if k = KeywordDefs[i].Name then begin
+      kw:= KeywordDefs[i].Value;
+      Exit(True);
+    end;
+  end;
+end;
+
+%}
+%x INCOMLINE INCOMMENT INSTRING INSTRINGL
+
+O [0-7]
+D [0-9]
+H [0-9a-fA-F]
+IDENT [a-zA-Z_]([a-zA-Z0-9_])*
+
+%%
+
+"//"                    start(INCOMLINE);
+<INCOMLINE>\n           begin start(0); unget_char(nl); end;
+<INCOMLINE>.            yymore;
+
+"/*"                    start(INCOMMENT);
+<INCOMMENT>.            ;
+<INCOMMENT>"*/"         start(0);
+<INCOMMENT>\0           return(_ILLEGAL);
+
+{D}+L?                  return(_NUMBER);
+0x{H}+L?                return(_NUMBER);
+0o{O}+L?                return(_NUMBER);
+L\"                               begin start(INSTRINGL); strbuf_begin(); end;
+\"                                begin start(INSTRING); strbuf_begin(); end;
+<INSTRING,INSTRINGL>\"\"          strbuf_append('"');
+<INSTRING>\"                      begin
+                                    start(0);
+                                    return(_QUOTEDSTR);
+                                  end;
+<INSTRINGL>\"                     begin
+                                    start(0);
+                                    return(_QUOTEDSTRL);
+                                  end;
+<INSTRING,INSTRINGL>\\\n          ;
+<INSTRING,INSTRINGL>\n            return(_ILLEGAL);
+<INSTRING,INSTRINGL>.             strbuf_append(yytext);
+\"StringFileInfo\"      begin yytext:= 'StringFileInfo'; return(_STR_StringFileInfo); end;
+\"VarFileInfo\"         begin yytext:= 'VarFileInfo'; return(_STR_VarFileInfo); end;
+\"Translation\"         begin yytext:= 'Translation'; return(_STR_Translation); end;
+
+BEGIN|{                 return(_BEGIN);
+END|}                   return(_END);
+{IDENT}                 begin
+                          if ypreproc.isdefine(yytext) then begin
+                            unget_char(' ');
+                            unget_string(ypreproc.getdefine(yytext));
+                          end else
+                            if KeywordToInt(yytext, kwtmp) then
+                              return(kwtmp)
+                            else
+                              return(_ID);
+                         end;
+[ \t\n\f]               ;
+[,()|^&+-*/%~]          returnc(yytext[1]);
+.                       return(_ILLEGAL);
+%%
+
+// end.
+
+
+
+
+

+ 2747 - 0
packages/fcl-res/src/rcparser.pas

@@ -0,0 +1,2747 @@
+
+(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)
+
+(* global definitions: *)
+
+(*
+Vorspann
+ ****************************************************************************)
+
+unit rcparser;
+
+{$I rcparserfn.inc}
+
+const _ILLEGAL = 257;
+const _NUMBER = 258;
+const _QUOTEDSTR = 259;
+const _QUOTEDSTRL = 260;
+const _STR_StringFileInfo = 261;
+const _STR_VarFileInfo = 262;
+const _STR_Translation = 263;
+const _BEGIN = 264;
+const _END = 265;
+const _ID = 266;
+const _LANGUAGE = 267;
+const _CHARACTERISTICS = 268;
+const _VERSION = 269;
+const _MOVEABLE = 270;
+const _FIXED = 271;
+const _PURE = 272;
+const _IMPURE = 273;
+const _PRELOAD = 274;
+const _LOADONCALL = 275;
+const _DISCARDABLE = 276;
+const _BITMAP = 277;
+const _CURSOR = 278;
+const _ICON = 279;
+const _STRINGTABLE = 280;
+const _VERSIONINFO = 281;
+const _ANICURSOR = 282;
+const _ANIICON = 283;
+const _DLGINCLUDE = 284;
+const _DLGINIT = 285;
+const _HTML = 286;
+const _MANIFEST = 287;
+const _MESSAGETABLE = 288;
+const _PLUGPLAY = 289;
+const _RCDATA = 290;
+const _VXD = 291;
+const _FILEVERSION = 292;
+const _PRODUCTVERSION = 293;
+const _FILEFLAGSMASK = 294;
+const _FILEFLAGS = 295;
+const _FILEOS = 296;
+const _FILETYPE = 297;
+const _FILESUBTYPE = 298;
+const _BLOCK = 299;
+const _VALUE = 300;
+const _ACCELERATORS = 301;
+const _DIALOG = 302;
+const _DIALOGEX = 303;
+const _MENU = 304;
+const _MENUEX = 305;
+const _NUMNEG = 306;
+
+type YYSType = record case Integer of
+                 1 : ( yyTFileStream : TFileStream );
+                 2 : ( yyTMemoryStream : TMemoryStream );
+                 3 : ( yyTResourceDesc : TResourceDesc );
+                 4 : ( yyrcnumtype : rcnumtype );
+                 5 : ( yyrcstrtype : rcstrtype );
+               end(*YYSType*);
+
+var yylval : YYSType;
+
+function yylex : Integer; forward;
+
+function yyparse : Integer;
+
+var yystate, yysp, yyn : Integer;
+    yys : array [1..yymaxdepth] of Integer;
+    yyv : array [1..yymaxdepth] of YYSType;
+    yyval : YYSType;
+
+procedure yyaction ( yyruleno : Integer );
+  (* local definitions: *)
+begin
+  (* actions: *)
+  case yyruleno of
+   1 : begin
+       end;
+   2 : begin
+         yyval := yyv[yysp-1];
+       end;
+   3 : begin
+         yyval := yyv[yysp-0];
+       end;
+   4 : begin
+         yyval := yyv[yysp-0];
+       end;
+   5 : begin
+         yyval := yyv[yysp-0];
+       end;
+   6 : begin
+         yyval := yyv[yysp-0];
+       end;
+   7 : begin
+         yyval := yyv[yysp-0];
+       end;
+   8 : begin
+         yyval := yyv[yysp-0];
+       end;
+   9 : begin
+         yyval := yyv[yysp-0];
+       end;
+  10 : begin
+         yyval := yyv[yysp-0];
+       end;
+  11 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, RT_BITMAP); 
+       end;
+  12 : begin
+         TBitmapResource(aktresource).SetCustomBitmapDataStream(yyv[yysp-0].yyTFileStream); 
+       end;
+  13 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, RT_CURSOR); 
+       end;
+  14 : begin
+         TGroupCursorResource(aktresource).SetCustomItemDataStream(yyv[yysp-0].yyTFileStream); 
+       end;
+  15 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, RT_ICON); 
+       end;
+  16 : begin
+         TGroupIconResource(aktresource).SetCustomItemDataStream(yyv[yysp-0].yyTFileStream); 
+       end;
+  17 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, RT_VERSION); 
+       end;
+  18 : begin
+         yyval := yyv[yysp-6];
+       end;
+  19 : begin
+       end;
+  20 : begin
+         TVersionResource(aktresource).FixedInfo.FileVersion:= make_version(yyv[yysp-6].yyrcnumtype.v, yyv[yysp-4].yyrcnumtype.v, yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  21 : begin
+         TVersionResource(aktresource).FixedInfo.ProductVersion:= make_version(yyv[yysp-6].yyrcnumtype.v, yyv[yysp-4].yyrcnumtype.v, yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  22 : begin
+         TVersionResource(aktresource).FixedInfo.FileFlagsMask:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  23 : begin
+         TVersionResource(aktresource).FixedInfo.FileFlags:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  24 : begin
+         TVersionResource(aktresource).FixedInfo.FileOS:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  25 : begin
+         TVersionResource(aktresource).FixedInfo.FileType:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  26 : begin
+         TVersionResource(aktresource).FixedInfo.FileSubType:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  27 : begin
+       end;
+  28 : begin
+         yyval := yyv[yysp-5];
+       end;
+  29 : begin
+         yyval := yyv[yysp-5];
+       end;
+  30 : begin
+       end;
+  31 : begin
+         version_string_tab_begin(yyv[yysp-1].yyrcstrtype.v^); 
+       end;
+  32 : begin
+         yyval := yyv[yysp-6];
+       end;
+  33 : begin
+       end;
+  34 : begin
+         version_string_tab_add(yyv[yysp-2].yyrcstrtype.v^, yyv[yysp-0].yyrcstrtype.v^); 
+       end;
+  35 : begin
+         yyval := yyv[yysp-3];
+       end;
+  36 : begin
+         version_var_translation_add(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  37 : begin
+         version_var_translation_add(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  38 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, yyv[yysp-0].yyTResourceDesc); 
+       end;
+  39 : begin
+         aktresource.SetCustomRawDataStream(yyv[yysp-0].yyTFileStream); 
+       end;
+  40 : begin
+         create_resource(yyv[yysp-1].yyTResourceDesc, yyv[yysp-0].yyTResourceDesc); 
+       end;
+  41 : begin
+         aktresource.SetCustomRawDataStream(yyv[yysp-1].yyTMemoryStream); 
+       end;
+  42 : begin
+         stringtable_begin(); 
+       end;
+  43 : begin
+         stringtable_end(); 
+       end;
+  44 : begin
+       end;
+  45 : begin
+         yyval := yyv[yysp-1];
+       end;
+  46 : begin
+         stringtable_add(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcstrtype.v^); 
+       end;
+  47 : begin
+         stringtable_add(yyv[yysp-1].yyrcnumtype.v, yyv[yysp-0].yyrcstrtype.v^); 
+       end;
+  48 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_ANICURSOR); 
+       end;
+  49 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_ANIICON); 
+       end;
+  50 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_DLGINCLUDE); 
+       end;
+  51 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_DLGINIT); 
+       end;
+  52 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(23); 
+       end;
+  53 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_MANIFEST); 
+       end;
+  54 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_MESSAGETABLE); 
+       end;
+  55 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_PLUGPLAY); 
+       end;
+  56 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_RCDATA); 
+       end;
+  57 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(RT_VXD); 
+       end;
+  58 : begin
+         yyval := yyv[yysp-0];
+       end;
+  59 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  60 : begin
+         yyval.yyTResourceDesc:= TResourceDesc.Create(yyv[yysp-0].yyrcstrtype.v^); 
+       end;
+  61 : begin
+       end;
+  62 : begin
+         yyval := yyv[yysp-1];
+       end;
+  63 : begin
+         change_lang_id(MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v)); 
+       end;
+  64 : begin
+         aktresource.Characteristics:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  65 : begin
+         aktresource.Version:= yyv[yysp-0].yyrcnumtype.v; 
+       end;
+  66 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_MOVEABLE; 
+       end;
+  67 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_MOVEABLE; 
+       end;
+  68 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PURE; 
+       end;
+  69 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PURE; 
+       end;
+  70 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PRELOAD; 
+       end;
+  71 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PRELOAD; 
+       end;
+  72 : begin
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_DISCARDABLE; 
+       end;
+  73 : begin
+         language:= MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+       end;
+  74 : begin
+         yyval := yyv[yysp-0];
+       end;
+  75 : begin
+         yyval.yyrcnumtype:= str_to_num(yytext); 
+       end;
+  76 : begin
+         yyval := yyv[yysp-0];
+       end;
+  77 : begin
+         yyval.yyrcnumtype:= yyv[yysp-1].yyrcnumtype; 
+       end;
+  78 : begin
+         yyval.yyrcnumtype.v:= not yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  79 : begin
+         yyval.yyrcnumtype.v:= -yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  80 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v * yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  81 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v div Max(1, yyv[yysp-0].yyrcnumtype.v); yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  82 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v mod Max(1, yyv[yysp-0].yyrcnumtype.v); yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  83 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v + yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  84 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v - yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  85 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v and yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  86 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v xor yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  87 : begin
+         yyval.yyrcnumtype.v:= yyv[yysp-2].yyrcnumtype.v or yyv[yysp-0].yyrcnumtype.v; yyval.yyrcnumtype.long:= yyv[yysp-2].yyrcnumtype.long or yyv[yysp-0].yyrcnumtype.long; 
+       end;
+  88 : begin
+         string_new(yyval.yyrcstrtype, yytext, opt_code_page); 
+       end;
+  89 : begin
+         yyval := yyv[yysp-0];
+       end;
+  90 : begin
+         yyval.yyTFileStream:= TFileStream.Create(ExpandFileName(yyv[yysp-0].yyrcstrtype.v^), fmOpenRead or fmShareDenyWrite);
+       end;
+  91 : begin
+         string_new_uni(yyval.yyrcstrtype, @strbuf[0], strbuflen, opt_code_page, true); 
+       end;
+  92 : begin
+         string_new_uni(yyval.yyrcstrtype, @strbuf[0], strbuflen, CP_UTF16, true); 
+       end;
+  93 : begin
+         string_new(yyval.yyrcstrtype, yytext, opt_code_page); 
+       end;
+  94 : begin
+         string_new(yyval.yyrcstrtype, yytext, opt_code_page); 
+       end;
+  95 : begin
+         string_new(yyval.yyrcstrtype, yytext, opt_code_page); 
+       end;
+  96 : begin
+         yyval.yyTMemoryStream:= TMemoryStream.Create; 
+       end;
+  97 : begin
+         yyval := yyv[yysp-1];
+       end;
+  98 : begin
+         yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream; 
+       end;
+  99 : begin
+         yyval := yyv[yysp-3];
+       end;
+ 100 : begin
+         
+         yyval.yyTMemoryStream:= yyv[yysp-0].yyTMemoryStream;
+         
+       end;
+ 101 : begin
+         
+         yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream;
+         raw_write_string(yyval.yyTMemoryStream, yyv[yysp-0].yyrcstrtype);
+         
+       end;
+ 102 : begin
+         
+         yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream;
+         raw_write_int(yyval.yyTMemoryStream, yyv[yysp-0].yyrcnumtype);
+         
+       end;
+  end;
+end(*yyaction*);
+
+(* parse table: *)
+
+type YYARec = record
+                sym, act : Integer;
+              end;
+     YYRRec = record
+                len, sym : Integer;
+              end;
+
+const
+
+yynacts   = 643;
+yyngotos  = 141;
+yynstates = 180;
+yynrules  = 102;
+
+yya : array [1..yynacts] of YYARec = (
+{ 0: }
+{ 1: }
+  ( sym: 0; act: 0 ),
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 266; act: 26 ),
+  ( sym: 267; act: 27 ),
+  ( sym: 280; act: 28 ),
+{ 2: }
+{ 3: }
+{ 4: }
+{ 5: }
+{ 6: }
+{ 7: }
+{ 8: }
+{ 9: }
+{ 10: }
+{ 11: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 266; act: 26 ),
+  ( sym: 277; act: 31 ),
+  ( sym: 278; act: 32 ),
+  ( sym: 279; act: 33 ),
+  ( sym: 281; act: 34 ),
+  ( sym: 282; act: 35 ),
+  ( sym: 283; act: 36 ),
+  ( sym: 284; act: 37 ),
+  ( sym: 285; act: 38 ),
+  ( sym: 286; act: 39 ),
+  ( sym: 287; act: 40 ),
+  ( sym: 288; act: 41 ),
+  ( sym: 289; act: 42 ),
+  ( sym: 290; act: 43 ),
+  ( sym: 291; act: 44 ),
+{ 12: }
+{ 13: }
+{ 14: }
+{ 15: }
+  ( sym: 37; act: 45 ),
+  ( sym: 38; act: 46 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 43; act: 48 ),
+  ( sym: 45; act: 49 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 94; act: 51 ),
+  ( sym: 124; act: 52 ),
+  ( sym: 0; act: -74 ),
+  ( sym: 40; act: -74 ),
+  ( sym: 44; act: -74 ),
+  ( sym: 126; act: -74 ),
+  ( sym: 258; act: -74 ),
+  ( sym: 259; act: -74 ),
+  ( sym: 260; act: -74 ),
+  ( sym: 261; act: -74 ),
+  ( sym: 262; act: -74 ),
+  ( sym: 263; act: -74 ),
+  ( sym: 264; act: -74 ),
+  ( sym: 266; act: -74 ),
+  ( sym: 267; act: -74 ),
+  ( sym: 268; act: -74 ),
+  ( sym: 269; act: -74 ),
+  ( sym: 270; act: -74 ),
+  ( sym: 271; act: -74 ),
+  ( sym: 272; act: -74 ),
+  ( sym: 273; act: -74 ),
+  ( sym: 274; act: -74 ),
+  ( sym: 275; act: -74 ),
+  ( sym: 276; act: -74 ),
+  ( sym: 277; act: -74 ),
+  ( sym: 278; act: -74 ),
+  ( sym: 279; act: -74 ),
+  ( sym: 280; act: -74 ),
+  ( sym: 281; act: -74 ),
+  ( sym: 282; act: -74 ),
+  ( sym: 283; act: -74 ),
+  ( sym: 284; act: -74 ),
+  ( sym: 285; act: -74 ),
+  ( sym: 286; act: -74 ),
+  ( sym: 287; act: -74 ),
+  ( sym: 288; act: -74 ),
+  ( sym: 289; act: -74 ),
+  ( sym: 290; act: -74 ),
+  ( sym: 291; act: -74 ),
+  ( sym: 292; act: -74 ),
+  ( sym: 293; act: -74 ),
+  ( sym: 294; act: -74 ),
+  ( sym: 295; act: -74 ),
+  ( sym: 296; act: -74 ),
+  ( sym: 297; act: -74 ),
+  ( sym: 298; act: -74 ),
+{ 16: }
+{ 17: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 18: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 19: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 20: }
+{ 21: }
+{ 22: }
+{ 23: }
+{ 24: }
+{ 25: }
+{ 26: }
+{ 27: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 28: }
+{ 29: }
+  ( sym: 259; act: -38 ),
+  ( sym: 260; act: -38 ),
+  ( sym: 261; act: -38 ),
+  ( sym: 262; act: -38 ),
+  ( sym: 263; act: -38 ),
+  ( sym: 267; act: -38 ),
+  ( sym: 268; act: -38 ),
+  ( sym: 269; act: -38 ),
+  ( sym: 270; act: -38 ),
+  ( sym: 271; act: -38 ),
+  ( sym: 272; act: -38 ),
+  ( sym: 273; act: -38 ),
+  ( sym: 274; act: -38 ),
+  ( sym: 275; act: -38 ),
+  ( sym: 276; act: -38 ),
+  ( sym: 264; act: -40 ),
+{ 30: }
+{ 31: }
+{ 32: }
+{ 33: }
+{ 34: }
+{ 35: }
+{ 36: }
+{ 37: }
+{ 38: }
+{ 39: }
+{ 40: }
+{ 41: }
+{ 42: }
+{ 43: }
+{ 44: }
+{ 45: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 46: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 47: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 48: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 49: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 50: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 51: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 52: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 53: }
+  ( sym: 37; act: 45 ),
+  ( sym: 38; act: 46 ),
+  ( sym: 41; act: 72 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 43; act: 48 ),
+  ( sym: 45; act: 49 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 94; act: 51 ),
+  ( sym: 124; act: 52 ),
+{ 54: }
+{ 55: }
+{ 56: }
+  ( sym: 44; act: 73 ),
+{ 57: }
+{ 58: }
+{ 59: }
+{ 60: }
+{ 61: }
+{ 62: }
+{ 63: }
+{ 64: }
+{ 65: }
+  ( sym: 37; act: 45 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 43; act: 48 ),
+  ( sym: 45; act: 49 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 0; act: -85 ),
+  ( sym: 38; act: -85 ),
+  ( sym: 40; act: -85 ),
+  ( sym: 41; act: -85 ),
+  ( sym: 44; act: -85 ),
+  ( sym: 94; act: -85 ),
+  ( sym: 124; act: -85 ),
+  ( sym: 126; act: -85 ),
+  ( sym: 258; act: -85 ),
+  ( sym: 259; act: -85 ),
+  ( sym: 260; act: -85 ),
+  ( sym: 261; act: -85 ),
+  ( sym: 262; act: -85 ),
+  ( sym: 263; act: -85 ),
+  ( sym: 264; act: -85 ),
+  ( sym: 266; act: -85 ),
+  ( sym: 267; act: -85 ),
+  ( sym: 268; act: -85 ),
+  ( sym: 269; act: -85 ),
+  ( sym: 270; act: -85 ),
+  ( sym: 271; act: -85 ),
+  ( sym: 272; act: -85 ),
+  ( sym: 273; act: -85 ),
+  ( sym: 274; act: -85 ),
+  ( sym: 275; act: -85 ),
+  ( sym: 276; act: -85 ),
+  ( sym: 277; act: -85 ),
+  ( sym: 278; act: -85 ),
+  ( sym: 279; act: -85 ),
+  ( sym: 280; act: -85 ),
+  ( sym: 281; act: -85 ),
+  ( sym: 282; act: -85 ),
+  ( sym: 283; act: -85 ),
+  ( sym: 284; act: -85 ),
+  ( sym: 285; act: -85 ),
+  ( sym: 286; act: -85 ),
+  ( sym: 287; act: -85 ),
+  ( sym: 288; act: -85 ),
+  ( sym: 289; act: -85 ),
+  ( sym: 290; act: -85 ),
+  ( sym: 291; act: -85 ),
+  ( sym: 292; act: -85 ),
+  ( sym: 293; act: -85 ),
+  ( sym: 294; act: -85 ),
+  ( sym: 295; act: -85 ),
+  ( sym: 296; act: -85 ),
+  ( sym: 297; act: -85 ),
+  ( sym: 298; act: -85 ),
+{ 66: }
+{ 67: }
+  ( sym: 37; act: 45 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 0; act: -83 ),
+  ( sym: 38; act: -83 ),
+  ( sym: 40; act: -83 ),
+  ( sym: 41; act: -83 ),
+  ( sym: 43; act: -83 ),
+  ( sym: 44; act: -83 ),
+  ( sym: 45; act: -83 ),
+  ( sym: 94; act: -83 ),
+  ( sym: 124; act: -83 ),
+  ( sym: 126; act: -83 ),
+  ( sym: 258; act: -83 ),
+  ( sym: 259; act: -83 ),
+  ( sym: 260; act: -83 ),
+  ( sym: 261; act: -83 ),
+  ( sym: 262; act: -83 ),
+  ( sym: 263; act: -83 ),
+  ( sym: 264; act: -83 ),
+  ( sym: 266; act: -83 ),
+  ( sym: 267; act: -83 ),
+  ( sym: 268; act: -83 ),
+  ( sym: 269; act: -83 ),
+  ( sym: 270; act: -83 ),
+  ( sym: 271; act: -83 ),
+  ( sym: 272; act: -83 ),
+  ( sym: 273; act: -83 ),
+  ( sym: 274; act: -83 ),
+  ( sym: 275; act: -83 ),
+  ( sym: 276; act: -83 ),
+  ( sym: 277; act: -83 ),
+  ( sym: 278; act: -83 ),
+  ( sym: 279; act: -83 ),
+  ( sym: 280; act: -83 ),
+  ( sym: 281; act: -83 ),
+  ( sym: 282; act: -83 ),
+  ( sym: 283; act: -83 ),
+  ( sym: 284; act: -83 ),
+  ( sym: 285; act: -83 ),
+  ( sym: 286; act: -83 ),
+  ( sym: 287; act: -83 ),
+  ( sym: 288; act: -83 ),
+  ( sym: 289; act: -83 ),
+  ( sym: 290; act: -83 ),
+  ( sym: 291; act: -83 ),
+  ( sym: 292; act: -83 ),
+  ( sym: 293; act: -83 ),
+  ( sym: 294; act: -83 ),
+  ( sym: 295; act: -83 ),
+  ( sym: 296; act: -83 ),
+  ( sym: 297; act: -83 ),
+  ( sym: 298; act: -83 ),
+{ 68: }
+  ( sym: 37; act: 45 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 0; act: -84 ),
+  ( sym: 38; act: -84 ),
+  ( sym: 40; act: -84 ),
+  ( sym: 41; act: -84 ),
+  ( sym: 43; act: -84 ),
+  ( sym: 44; act: -84 ),
+  ( sym: 45; act: -84 ),
+  ( sym: 94; act: -84 ),
+  ( sym: 124; act: -84 ),
+  ( sym: 126; act: -84 ),
+  ( sym: 258; act: -84 ),
+  ( sym: 259; act: -84 ),
+  ( sym: 260; act: -84 ),
+  ( sym: 261; act: -84 ),
+  ( sym: 262; act: -84 ),
+  ( sym: 263; act: -84 ),
+  ( sym: 264; act: -84 ),
+  ( sym: 266; act: -84 ),
+  ( sym: 267; act: -84 ),
+  ( sym: 268; act: -84 ),
+  ( sym: 269; act: -84 ),
+  ( sym: 270; act: -84 ),
+  ( sym: 271; act: -84 ),
+  ( sym: 272; act: -84 ),
+  ( sym: 273; act: -84 ),
+  ( sym: 274; act: -84 ),
+  ( sym: 275; act: -84 ),
+  ( sym: 276; act: -84 ),
+  ( sym: 277; act: -84 ),
+  ( sym: 278; act: -84 ),
+  ( sym: 279; act: -84 ),
+  ( sym: 280; act: -84 ),
+  ( sym: 281; act: -84 ),
+  ( sym: 282; act: -84 ),
+  ( sym: 283; act: -84 ),
+  ( sym: 284; act: -84 ),
+  ( sym: 285; act: -84 ),
+  ( sym: 286; act: -84 ),
+  ( sym: 287; act: -84 ),
+  ( sym: 288; act: -84 ),
+  ( sym: 289; act: -84 ),
+  ( sym: 290; act: -84 ),
+  ( sym: 291; act: -84 ),
+  ( sym: 292; act: -84 ),
+  ( sym: 293; act: -84 ),
+  ( sym: 294; act: -84 ),
+  ( sym: 295; act: -84 ),
+  ( sym: 296; act: -84 ),
+  ( sym: 297; act: -84 ),
+  ( sym: 298; act: -84 ),
+{ 69: }
+{ 70: }
+  ( sym: 37; act: 45 ),
+  ( sym: 38; act: 46 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 43; act: 48 ),
+  ( sym: 45; act: 49 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 0; act: -86 ),
+  ( sym: 40; act: -86 ),
+  ( sym: 41; act: -86 ),
+  ( sym: 44; act: -86 ),
+  ( sym: 94; act: -86 ),
+  ( sym: 124; act: -86 ),
+  ( sym: 126; act: -86 ),
+  ( sym: 258; act: -86 ),
+  ( sym: 259; act: -86 ),
+  ( sym: 260; act: -86 ),
+  ( sym: 261; act: -86 ),
+  ( sym: 262; act: -86 ),
+  ( sym: 263; act: -86 ),
+  ( sym: 264; act: -86 ),
+  ( sym: 266; act: -86 ),
+  ( sym: 267; act: -86 ),
+  ( sym: 268; act: -86 ),
+  ( sym: 269; act: -86 ),
+  ( sym: 270; act: -86 ),
+  ( sym: 271; act: -86 ),
+  ( sym: 272; act: -86 ),
+  ( sym: 273; act: -86 ),
+  ( sym: 274; act: -86 ),
+  ( sym: 275; act: -86 ),
+  ( sym: 276; act: -86 ),
+  ( sym: 277; act: -86 ),
+  ( sym: 278; act: -86 ),
+  ( sym: 279; act: -86 ),
+  ( sym: 280; act: -86 ),
+  ( sym: 281; act: -86 ),
+  ( sym: 282; act: -86 ),
+  ( sym: 283; act: -86 ),
+  ( sym: 284; act: -86 ),
+  ( sym: 285; act: -86 ),
+  ( sym: 286; act: -86 ),
+  ( sym: 287; act: -86 ),
+  ( sym: 288; act: -86 ),
+  ( sym: 289; act: -86 ),
+  ( sym: 290; act: -86 ),
+  ( sym: 291; act: -86 ),
+  ( sym: 292; act: -86 ),
+  ( sym: 293; act: -86 ),
+  ( sym: 294; act: -86 ),
+  ( sym: 295; act: -86 ),
+  ( sym: 296; act: -86 ),
+  ( sym: 297; act: -86 ),
+  ( sym: 298; act: -86 ),
+{ 71: }
+  ( sym: 37; act: 45 ),
+  ( sym: 38; act: 46 ),
+  ( sym: 42; act: 47 ),
+  ( sym: 43; act: 48 ),
+  ( sym: 45; act: 49 ),
+  ( sym: 47; act: 50 ),
+  ( sym: 94; act: 51 ),
+  ( sym: 0; act: -87 ),
+  ( sym: 40; act: -87 ),
+  ( sym: 41; act: -87 ),
+  ( sym: 44; act: -87 ),
+  ( sym: 124; act: -87 ),
+  ( sym: 126; act: -87 ),
+  ( sym: 258; act: -87 ),
+  ( sym: 259; act: -87 ),
+  ( sym: 260; act: -87 ),
+  ( sym: 261; act: -87 ),
+  ( sym: 262; act: -87 ),
+  ( sym: 263; act: -87 ),
+  ( sym: 264; act: -87 ),
+  ( sym: 266; act: -87 ),
+  ( sym: 267; act: -87 ),
+  ( sym: 268; act: -87 ),
+  ( sym: 269; act: -87 ),
+  ( sym: 270; act: -87 ),
+  ( sym: 271; act: -87 ),
+  ( sym: 272; act: -87 ),
+  ( sym: 273; act: -87 ),
+  ( sym: 274; act: -87 ),
+  ( sym: 275; act: -87 ),
+  ( sym: 276; act: -87 ),
+  ( sym: 277; act: -87 ),
+  ( sym: 278; act: -87 ),
+  ( sym: 279; act: -87 ),
+  ( sym: 280; act: -87 ),
+  ( sym: 281; act: -87 ),
+  ( sym: 282; act: -87 ),
+  ( sym: 283; act: -87 ),
+  ( sym: 284; act: -87 ),
+  ( sym: 285; act: -87 ),
+  ( sym: 286; act: -87 ),
+  ( sym: 287; act: -87 ),
+  ( sym: 288; act: -87 ),
+  ( sym: 289; act: -87 ),
+  ( sym: 290; act: -87 ),
+  ( sym: 291; act: -87 ),
+  ( sym: 292; act: -87 ),
+  ( sym: 293; act: -87 ),
+  ( sym: 294; act: -87 ),
+  ( sym: 295; act: -87 ),
+  ( sym: 296; act: -87 ),
+  ( sym: 297; act: -87 ),
+  ( sym: 298; act: -87 ),
+{ 72: }
+{ 73: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 74: }
+  ( sym: 264; act: 83 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 75: }
+  ( sym: 264; act: 94 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 76: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 77: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 78: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 79: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 267; act: 84 ),
+  ( sym: 268; act: 85 ),
+  ( sym: 269; act: 86 ),
+  ( sym: 270; act: 87 ),
+  ( sym: 271; act: 88 ),
+  ( sym: 272; act: 89 ),
+  ( sym: 273; act: 90 ),
+  ( sym: 274; act: 91 ),
+  ( sym: 275; act: 92 ),
+  ( sym: 276; act: 93 ),
+{ 80: }
+  ( sym: 264; act: 100 ),
+  ( sym: 292; act: 101 ),
+  ( sym: 293; act: 102 ),
+  ( sym: 294; act: 103 ),
+  ( sym: 295; act: 104 ),
+  ( sym: 296; act: 105 ),
+  ( sym: 297; act: 106 ),
+  ( sym: 298; act: 107 ),
+{ 81: }
+{ 82: }
+{ 83: }
+{ 84: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 85: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 86: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 87: }
+{ 88: }
+{ 89: }
+{ 90: }
+{ 91: }
+{ 92: }
+{ 93: }
+{ 94: }
+{ 95: }
+{ 96: }
+{ 97: }
+{ 98: }
+{ 99: }
+{ 100: }
+{ 101: }
+  ( sym: 258; act: 20 ),
+{ 102: }
+  ( sym: 258; act: 20 ),
+{ 103: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 104: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 105: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 106: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 107: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 108: }
+  ( sym: 258; act: 20 ),
+  ( sym: 265; act: 124 ),
+{ 109: }
+  ( sym: 44; act: 125 ),
+{ 110: }
+{ 111: }
+{ 112: }
+  ( sym: 258; act: 20 ),
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 44; act: -100 ),
+  ( sym: 265; act: -100 ),
+{ 113: }
+  ( sym: 44; act: 129 ),
+  ( sym: 265; act: 130 ),
+{ 114: }
+  ( sym: 265; act: 131 ),
+  ( sym: 299; act: 132 ),
+{ 115: }
+  ( sym: 44; act: 133 ),
+{ 116: }
+  ( sym: 44; act: 134 ),
+{ 117: }
+{ 118: }
+{ 119: }
+{ 120: }
+{ 121: }
+{ 122: }
+{ 123: }
+  ( sym: 44; act: 136 ),
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+{ 124: }
+{ 125: }
+  ( sym: 40; act: 17 ),
+  ( sym: 45; act: 18 ),
+  ( sym: 126; act: 19 ),
+  ( sym: 258; act: 20 ),
+{ 126: }
+{ 127: }
+{ 128: }
+{ 129: }
+{ 130: }
+{ 131: }
+{ 132: }
+  ( sym: 261; act: 139 ),
+  ( sym: 262; act: 140 ),
+{ 133: }
+  ( sym: 258; act: 20 ),
+{ 134: }
+  ( sym: 258; act: 20 ),
+{ 135: }
+{ 136: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+{ 137: }
+{ 138: }
+  ( sym: 258; act: 20 ),
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+  ( sym: 44; act: -100 ),
+  ( sym: 265; act: -100 ),
+{ 139: }
+  ( sym: 264; act: 145 ),
+{ 140: }
+  ( sym: 264; act: 146 ),
+{ 141: }
+  ( sym: 44; act: 147 ),
+{ 142: }
+  ( sym: 44; act: 148 ),
+{ 143: }
+{ 144: }
+{ 145: }
+{ 146: }
+  ( sym: 300; act: 151 ),
+{ 147: }
+  ( sym: 258; act: 20 ),
+{ 148: }
+  ( sym: 258; act: 20 ),
+{ 149: }
+  ( sym: 265; act: 154 ),
+  ( sym: 299; act: 155 ),
+{ 150: }
+  ( sym: 265; act: 156 ),
+{ 151: }
+  ( sym: 263; act: 157 ),
+{ 152: }
+  ( sym: 44; act: 158 ),
+{ 153: }
+  ( sym: 44; act: 159 ),
+{ 154: }
+{ 155: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+{ 156: }
+{ 157: }
+  ( sym: 44; act: 161 ),
+{ 158: }
+  ( sym: 258; act: 20 ),
+{ 159: }
+  ( sym: 258; act: 20 ),
+{ 160: }
+  ( sym: 264; act: 164 ),
+{ 161: }
+  ( sym: 258; act: 20 ),
+{ 162: }
+{ 163: }
+{ 164: }
+{ 165: }
+  ( sym: 44; act: 168 ),
+  ( sym: 265; act: -35 ),
+{ 166: }
+  ( sym: 44; act: 169 ),
+{ 167: }
+{ 168: }
+  ( sym: 258; act: 20 ),
+{ 169: }
+  ( sym: 258; act: 20 ),
+{ 170: }
+  ( sym: 265; act: 173 ),
+  ( sym: 300; act: 174 ),
+{ 171: }
+  ( sym: 44; act: 175 ),
+{ 172: }
+{ 173: }
+{ 174: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 ),
+{ 175: }
+  ( sym: 258; act: 20 ),
+{ 176: }
+  ( sym: 44; act: 178 ),
+{ 177: }
+{ 178: }
+  ( sym: 259; act: 21 ),
+  ( sym: 260; act: 22 ),
+  ( sym: 261; act: 23 ),
+  ( sym: 262; act: 24 ),
+  ( sym: 263; act: 25 )
+{ 179: }
+);
+
+yyg : array [1..yyngotos] of YYARec = (
+{ 0: }
+  ( sym: -12; act: 1 ),
+{ 1: }
+  ( sym: -21; act: 2 ),
+  ( sym: -20; act: 3 ),
+  ( sym: -19; act: 4 ),
+  ( sym: -18; act: 5 ),
+  ( sym: -17; act: 6 ),
+  ( sym: -16; act: 7 ),
+  ( sym: -15; act: 8 ),
+  ( sym: -14; act: 9 ),
+  ( sym: -13; act: 10 ),
+  ( sym: -7; act: 11 ),
+  ( sym: -6; act: 12 ),
+  ( sym: -5; act: 13 ),
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 16 ),
+{ 2: }
+{ 3: }
+{ 4: }
+{ 5: }
+{ 6: }
+{ 7: }
+{ 8: }
+{ 9: }
+{ 10: }
+{ 11: }
+  ( sym: -8; act: 29 ),
+  ( sym: -7; act: 30 ),
+  ( sym: -6; act: 12 ),
+  ( sym: -5; act: 13 ),
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 16 ),
+{ 12: }
+{ 13: }
+{ 14: }
+{ 15: }
+{ 16: }
+{ 17: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 53 ),
+{ 18: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 54 ),
+{ 19: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 55 ),
+{ 20: }
+{ 21: }
+{ 22: }
+{ 23: }
+{ 24: }
+{ 25: }
+{ 26: }
+{ 27: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 56 ),
+{ 28: }
+  ( sym: -36; act: 57 ),
+{ 29: }
+  ( sym: -35; act: 58 ),
+  ( sym: -34; act: 59 ),
+{ 30: }
+{ 31: }
+  ( sym: -23; act: 60 ),
+{ 32: }
+  ( sym: -24; act: 61 ),
+{ 33: }
+  ( sym: -25; act: 62 ),
+{ 34: }
+  ( sym: -27; act: 63 ),
+{ 35: }
+{ 36: }
+{ 37: }
+{ 38: }
+{ 39: }
+{ 40: }
+{ 41: }
+{ 42: }
+{ 43: }
+{ 44: }
+{ 45: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 64 ),
+{ 46: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 65 ),
+{ 47: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 66 ),
+{ 48: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 67 ),
+{ 49: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 68 ),
+{ 50: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 69 ),
+{ 51: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 70 ),
+{ 52: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 71 ),
+{ 53: }
+{ 54: }
+{ 55: }
+{ 56: }
+{ 57: }
+  ( sym: -22; act: 74 ),
+{ 58: }
+  ( sym: -22; act: 75 ),
+{ 59: }
+  ( sym: -22; act: 76 ),
+{ 60: }
+  ( sym: -22; act: 77 ),
+{ 61: }
+  ( sym: -22; act: 78 ),
+{ 62: }
+  ( sym: -22; act: 79 ),
+{ 63: }
+  ( sym: -26; act: 80 ),
+{ 64: }
+{ 65: }
+{ 66: }
+{ 67: }
+{ 68: }
+{ 69: }
+{ 70: }
+{ 71: }
+{ 72: }
+{ 73: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 81 ),
+{ 74: }
+  ( sym: -39; act: 82 ),
+{ 75: }
+  ( sym: -39; act: 82 ),
+{ 76: }
+  ( sym: -39; act: 82 ),
+  ( sym: -11; act: 95 ),
+  ( sym: -6; act: 96 ),
+{ 77: }
+  ( sym: -39; act: 82 ),
+  ( sym: -11; act: 97 ),
+  ( sym: -6; act: 96 ),
+{ 78: }
+  ( sym: -39; act: 82 ),
+  ( sym: -11; act: 98 ),
+  ( sym: -6; act: 96 ),
+{ 79: }
+  ( sym: -39; act: 82 ),
+  ( sym: -11; act: 99 ),
+  ( sym: -6; act: 96 ),
+{ 80: }
+{ 81: }
+{ 82: }
+{ 83: }
+  ( sym: -37; act: 108 ),
+{ 84: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 109 ),
+{ 85: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 110 ),
+{ 86: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 111 ),
+{ 87: }
+{ 88: }
+{ 89: }
+{ 90: }
+{ 91: }
+{ 92: }
+{ 93: }
+{ 94: }
+  ( sym: -40; act: 112 ),
+  ( sym: -9; act: 113 ),
+{ 95: }
+{ 96: }
+{ 97: }
+{ 98: }
+{ 99: }
+{ 100: }
+  ( sym: -28; act: 114 ),
+{ 101: }
+  ( sym: -4; act: 115 ),
+{ 102: }
+  ( sym: -4; act: 116 ),
+{ 103: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 117 ),
+{ 104: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 118 ),
+{ 105: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 119 ),
+{ 106: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 120 ),
+{ 107: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 121 ),
+{ 108: }
+  ( sym: -38; act: 122 ),
+  ( sym: -4; act: 123 ),
+{ 109: }
+{ 110: }
+{ 111: }
+{ 112: }
+  ( sym: -10; act: 126 ),
+  ( sym: -6; act: 127 ),
+  ( sym: -4; act: 128 ),
+{ 113: }
+{ 114: }
+{ 115: }
+{ 116: }
+{ 117: }
+{ 118: }
+{ 119: }
+{ 120: }
+{ 121: }
+{ 122: }
+{ 123: }
+  ( sym: -6; act: 135 ),
+{ 124: }
+{ 125: }
+  ( sym: -4; act: 14 ),
+  ( sym: -3; act: 15 ),
+  ( sym: -2; act: 137 ),
+{ 126: }
+{ 127: }
+{ 128: }
+{ 129: }
+  ( sym: -41; act: 138 ),
+{ 130: }
+{ 131: }
+{ 132: }
+{ 133: }
+  ( sym: -4; act: 141 ),
+{ 134: }
+  ( sym: -4; act: 142 ),
+{ 135: }
+{ 136: }
+  ( sym: -6; act: 143 ),
+{ 137: }
+{ 138: }
+  ( sym: -10; act: 144 ),
+  ( sym: -6; act: 127 ),
+  ( sym: -4; act: 128 ),
+{ 139: }
+{ 140: }
+{ 141: }
+{ 142: }
+{ 143: }
+{ 144: }
+{ 145: }
+  ( sym: -29; act: 149 ),
+{ 146: }
+  ( sym: -30; act: 150 ),
+{ 147: }
+  ( sym: -4; act: 152 ),
+{ 148: }
+  ( sym: -4; act: 153 ),
+{ 149: }
+{ 150: }
+{ 151: }
+{ 152: }
+{ 153: }
+{ 154: }
+{ 155: }
+  ( sym: -6; act: 160 ),
+{ 156: }
+{ 157: }
+{ 158: }
+  ( sym: -4; act: 162 ),
+{ 159: }
+  ( sym: -4; act: 163 ),
+{ 160: }
+{ 161: }
+  ( sym: -33; act: 165 ),
+  ( sym: -4; act: 166 ),
+{ 162: }
+{ 163: }
+{ 164: }
+  ( sym: -32; act: 167 ),
+{ 165: }
+{ 166: }
+{ 167: }
+  ( sym: -31; act: 170 ),
+{ 168: }
+  ( sym: -4; act: 171 ),
+{ 169: }
+  ( sym: -4; act: 172 ),
+{ 170: }
+{ 171: }
+{ 172: }
+{ 173: }
+{ 174: }
+  ( sym: -6; act: 176 ),
+{ 175: }
+  ( sym: -4; act: 177 ),
+{ 176: }
+{ 177: }
+{ 178: }
+  ( sym: -6; act: 179 )
+{ 179: }
+);
+
+yyd : array [0..yynstates-1] of Integer = (
+{ 0: } -1,
+{ 1: } 0,
+{ 2: } -10,
+{ 3: } -9,
+{ 4: } -8,
+{ 5: } -7,
+{ 6: } -6,
+{ 7: } -5,
+{ 8: } -4,
+{ 9: } -3,
+{ 10: } -2,
+{ 11: } 0,
+{ 12: } -89,
+{ 13: } -60,
+{ 14: } -76,
+{ 15: } 0,
+{ 16: } -59,
+{ 17: } 0,
+{ 18: } 0,
+{ 19: } 0,
+{ 20: } -75,
+{ 21: } -91,
+{ 22: } -92,
+{ 23: } -93,
+{ 24: } -94,
+{ 25: } -95,
+{ 26: } -88,
+{ 27: } 0,
+{ 28: } -42,
+{ 29: } 0,
+{ 30: } -58,
+{ 31: } -11,
+{ 32: } -13,
+{ 33: } -15,
+{ 34: } -17,
+{ 35: } -48,
+{ 36: } -49,
+{ 37: } -50,
+{ 38: } -51,
+{ 39: } -52,
+{ 40: } -53,
+{ 41: } -54,
+{ 42: } -55,
+{ 43: } -56,
+{ 44: } -57,
+{ 45: } 0,
+{ 46: } 0,
+{ 47: } 0,
+{ 48: } 0,
+{ 49: } 0,
+{ 50: } 0,
+{ 51: } 0,
+{ 52: } 0,
+{ 53: } 0,
+{ 54: } -79,
+{ 55: } -78,
+{ 56: } 0,
+{ 57: } -61,
+{ 58: } -61,
+{ 59: } -61,
+{ 60: } -61,
+{ 61: } -61,
+{ 62: } -61,
+{ 63: } -19,
+{ 64: } -82,
+{ 65: } 0,
+{ 66: } -80,
+{ 67: } 0,
+{ 68: } 0,
+{ 69: } -81,
+{ 70: } 0,
+{ 71: } 0,
+{ 72: } -77,
+{ 73: } 0,
+{ 74: } 0,
+{ 75: } 0,
+{ 76: } 0,
+{ 77: } 0,
+{ 78: } 0,
+{ 79: } 0,
+{ 80: } 0,
+{ 81: } -73,
+{ 82: } -62,
+{ 83: } -44,
+{ 84: } 0,
+{ 85: } 0,
+{ 86: } 0,
+{ 87: } -66,
+{ 88: } -67,
+{ 89: } -68,
+{ 90: } -69,
+{ 91: } -70,
+{ 92: } -71,
+{ 93: } -72,
+{ 94: } -96,
+{ 95: } -39,
+{ 96: } -90,
+{ 97: } -12,
+{ 98: } -14,
+{ 99: } -16,
+{ 100: } -27,
+{ 101: } 0,
+{ 102: } 0,
+{ 103: } 0,
+{ 104: } 0,
+{ 105: } 0,
+{ 106: } 0,
+{ 107: } 0,
+{ 108: } 0,
+{ 109: } 0,
+{ 110: } -64,
+{ 111: } -65,
+{ 112: } 0,
+{ 113: } 0,
+{ 114: } 0,
+{ 115: } 0,
+{ 116: } 0,
+{ 117: } -22,
+{ 118: } -23,
+{ 119: } -24,
+{ 120: } -25,
+{ 121: } -26,
+{ 122: } -45,
+{ 123: } 0,
+{ 124: } -43,
+{ 125: } 0,
+{ 126: } -97,
+{ 127: } -101,
+{ 128: } -102,
+{ 129: } -98,
+{ 130: } -41,
+{ 131: } -18,
+{ 132: } 0,
+{ 133: } 0,
+{ 134: } 0,
+{ 135: } -47,
+{ 136: } 0,
+{ 137: } -63,
+{ 138: } 0,
+{ 139: } 0,
+{ 140: } 0,
+{ 141: } 0,
+{ 142: } 0,
+{ 143: } -46,
+{ 144: } -99,
+{ 145: } -30,
+{ 146: } 0,
+{ 147: } 0,
+{ 148: } 0,
+{ 149: } 0,
+{ 150: } 0,
+{ 151: } 0,
+{ 152: } 0,
+{ 153: } 0,
+{ 154: } -28,
+{ 155: } 0,
+{ 156: } -29,
+{ 157: } 0,
+{ 158: } 0,
+{ 159: } 0,
+{ 160: } 0,
+{ 161: } 0,
+{ 162: } -20,
+{ 163: } -21,
+{ 164: } -31,
+{ 165: } 0,
+{ 166: } 0,
+{ 167: } -33,
+{ 168: } 0,
+{ 169: } 0,
+{ 170: } 0,
+{ 171: } 0,
+{ 172: } -36,
+{ 173: } -32,
+{ 174: } 0,
+{ 175: } 0,
+{ 176: } 0,
+{ 177: } -37,
+{ 178: } 0,
+{ 179: } -34
+);
+
+yyal : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 1,
+{ 2: } 14,
+{ 3: } 14,
+{ 4: } 14,
+{ 5: } 14,
+{ 6: } 14,
+{ 7: } 14,
+{ 8: } 14,
+{ 9: } 14,
+{ 10: } 14,
+{ 11: } 14,
+{ 12: } 38,
+{ 13: } 38,
+{ 14: } 38,
+{ 15: } 38,
+{ 16: } 90,
+{ 17: } 90,
+{ 18: } 94,
+{ 19: } 98,
+{ 20: } 102,
+{ 21: } 102,
+{ 22: } 102,
+{ 23: } 102,
+{ 24: } 102,
+{ 25: } 102,
+{ 26: } 102,
+{ 27: } 102,
+{ 28: } 106,
+{ 29: } 106,
+{ 30: } 122,
+{ 31: } 122,
+{ 32: } 122,
+{ 33: } 122,
+{ 34: } 122,
+{ 35: } 122,
+{ 36: } 122,
+{ 37: } 122,
+{ 38: } 122,
+{ 39: } 122,
+{ 40: } 122,
+{ 41: } 122,
+{ 42: } 122,
+{ 43: } 122,
+{ 44: } 122,
+{ 45: } 122,
+{ 46: } 126,
+{ 47: } 130,
+{ 48: } 134,
+{ 49: } 138,
+{ 50: } 142,
+{ 51: } 146,
+{ 52: } 150,
+{ 53: } 154,
+{ 54: } 163,
+{ 55: } 163,
+{ 56: } 163,
+{ 57: } 164,
+{ 58: } 164,
+{ 59: } 164,
+{ 60: } 164,
+{ 61: } 164,
+{ 62: } 164,
+{ 63: } 164,
+{ 64: } 164,
+{ 65: } 164,
+{ 66: } 217,
+{ 67: } 217,
+{ 68: } 270,
+{ 69: } 323,
+{ 70: } 323,
+{ 71: } 376,
+{ 72: } 429,
+{ 73: } 429,
+{ 74: } 433,
+{ 75: } 444,
+{ 76: } 455,
+{ 77: } 470,
+{ 78: } 485,
+{ 79: } 500,
+{ 80: } 515,
+{ 81: } 523,
+{ 82: } 523,
+{ 83: } 523,
+{ 84: } 523,
+{ 85: } 527,
+{ 86: } 531,
+{ 87: } 535,
+{ 88: } 535,
+{ 89: } 535,
+{ 90: } 535,
+{ 91: } 535,
+{ 92: } 535,
+{ 93: } 535,
+{ 94: } 535,
+{ 95: } 535,
+{ 96: } 535,
+{ 97: } 535,
+{ 98: } 535,
+{ 99: } 535,
+{ 100: } 535,
+{ 101: } 535,
+{ 102: } 536,
+{ 103: } 537,
+{ 104: } 541,
+{ 105: } 545,
+{ 106: } 549,
+{ 107: } 553,
+{ 108: } 557,
+{ 109: } 559,
+{ 110: } 560,
+{ 111: } 560,
+{ 112: } 560,
+{ 113: } 568,
+{ 114: } 570,
+{ 115: } 572,
+{ 116: } 573,
+{ 117: } 574,
+{ 118: } 574,
+{ 119: } 574,
+{ 120: } 574,
+{ 121: } 574,
+{ 122: } 574,
+{ 123: } 574,
+{ 124: } 580,
+{ 125: } 580,
+{ 126: } 584,
+{ 127: } 584,
+{ 128: } 584,
+{ 129: } 584,
+{ 130: } 584,
+{ 131: } 584,
+{ 132: } 584,
+{ 133: } 586,
+{ 134: } 587,
+{ 135: } 588,
+{ 136: } 588,
+{ 137: } 593,
+{ 138: } 593,
+{ 139: } 601,
+{ 140: } 602,
+{ 141: } 603,
+{ 142: } 604,
+{ 143: } 605,
+{ 144: } 605,
+{ 145: } 605,
+{ 146: } 605,
+{ 147: } 606,
+{ 148: } 607,
+{ 149: } 608,
+{ 150: } 610,
+{ 151: } 611,
+{ 152: } 612,
+{ 153: } 613,
+{ 154: } 614,
+{ 155: } 614,
+{ 156: } 619,
+{ 157: } 619,
+{ 158: } 620,
+{ 159: } 621,
+{ 160: } 622,
+{ 161: } 623,
+{ 162: } 624,
+{ 163: } 624,
+{ 164: } 624,
+{ 165: } 624,
+{ 166: } 626,
+{ 167: } 627,
+{ 168: } 627,
+{ 169: } 628,
+{ 170: } 629,
+{ 171: } 631,
+{ 172: } 632,
+{ 173: } 632,
+{ 174: } 632,
+{ 175: } 637,
+{ 176: } 638,
+{ 177: } 639,
+{ 178: } 639,
+{ 179: } 644
+);
+
+yyah : array [0..yynstates-1] of Integer = (
+{ 0: } 0,
+{ 1: } 13,
+{ 2: } 13,
+{ 3: } 13,
+{ 4: } 13,
+{ 5: } 13,
+{ 6: } 13,
+{ 7: } 13,
+{ 8: } 13,
+{ 9: } 13,
+{ 10: } 13,
+{ 11: } 37,
+{ 12: } 37,
+{ 13: } 37,
+{ 14: } 37,
+{ 15: } 89,
+{ 16: } 89,
+{ 17: } 93,
+{ 18: } 97,
+{ 19: } 101,
+{ 20: } 101,
+{ 21: } 101,
+{ 22: } 101,
+{ 23: } 101,
+{ 24: } 101,
+{ 25: } 101,
+{ 26: } 101,
+{ 27: } 105,
+{ 28: } 105,
+{ 29: } 121,
+{ 30: } 121,
+{ 31: } 121,
+{ 32: } 121,
+{ 33: } 121,
+{ 34: } 121,
+{ 35: } 121,
+{ 36: } 121,
+{ 37: } 121,
+{ 38: } 121,
+{ 39: } 121,
+{ 40: } 121,
+{ 41: } 121,
+{ 42: } 121,
+{ 43: } 121,
+{ 44: } 121,
+{ 45: } 125,
+{ 46: } 129,
+{ 47: } 133,
+{ 48: } 137,
+{ 49: } 141,
+{ 50: } 145,
+{ 51: } 149,
+{ 52: } 153,
+{ 53: } 162,
+{ 54: } 162,
+{ 55: } 162,
+{ 56: } 163,
+{ 57: } 163,
+{ 58: } 163,
+{ 59: } 163,
+{ 60: } 163,
+{ 61: } 163,
+{ 62: } 163,
+{ 63: } 163,
+{ 64: } 163,
+{ 65: } 216,
+{ 66: } 216,
+{ 67: } 269,
+{ 68: } 322,
+{ 69: } 322,
+{ 70: } 375,
+{ 71: } 428,
+{ 72: } 428,
+{ 73: } 432,
+{ 74: } 443,
+{ 75: } 454,
+{ 76: } 469,
+{ 77: } 484,
+{ 78: } 499,
+{ 79: } 514,
+{ 80: } 522,
+{ 81: } 522,
+{ 82: } 522,
+{ 83: } 522,
+{ 84: } 526,
+{ 85: } 530,
+{ 86: } 534,
+{ 87: } 534,
+{ 88: } 534,
+{ 89: } 534,
+{ 90: } 534,
+{ 91: } 534,
+{ 92: } 534,
+{ 93: } 534,
+{ 94: } 534,
+{ 95: } 534,
+{ 96: } 534,
+{ 97: } 534,
+{ 98: } 534,
+{ 99: } 534,
+{ 100: } 534,
+{ 101: } 535,
+{ 102: } 536,
+{ 103: } 540,
+{ 104: } 544,
+{ 105: } 548,
+{ 106: } 552,
+{ 107: } 556,
+{ 108: } 558,
+{ 109: } 559,
+{ 110: } 559,
+{ 111: } 559,
+{ 112: } 567,
+{ 113: } 569,
+{ 114: } 571,
+{ 115: } 572,
+{ 116: } 573,
+{ 117: } 573,
+{ 118: } 573,
+{ 119: } 573,
+{ 120: } 573,
+{ 121: } 573,
+{ 122: } 573,
+{ 123: } 579,
+{ 124: } 579,
+{ 125: } 583,
+{ 126: } 583,
+{ 127: } 583,
+{ 128: } 583,
+{ 129: } 583,
+{ 130: } 583,
+{ 131: } 583,
+{ 132: } 585,
+{ 133: } 586,
+{ 134: } 587,
+{ 135: } 587,
+{ 136: } 592,
+{ 137: } 592,
+{ 138: } 600,
+{ 139: } 601,
+{ 140: } 602,
+{ 141: } 603,
+{ 142: } 604,
+{ 143: } 604,
+{ 144: } 604,
+{ 145: } 604,
+{ 146: } 605,
+{ 147: } 606,
+{ 148: } 607,
+{ 149: } 609,
+{ 150: } 610,
+{ 151: } 611,
+{ 152: } 612,
+{ 153: } 613,
+{ 154: } 613,
+{ 155: } 618,
+{ 156: } 618,
+{ 157: } 619,
+{ 158: } 620,
+{ 159: } 621,
+{ 160: } 622,
+{ 161: } 623,
+{ 162: } 623,
+{ 163: } 623,
+{ 164: } 623,
+{ 165: } 625,
+{ 166: } 626,
+{ 167: } 626,
+{ 168: } 627,
+{ 169: } 628,
+{ 170: } 630,
+{ 171: } 631,
+{ 172: } 631,
+{ 173: } 631,
+{ 174: } 636,
+{ 175: } 637,
+{ 176: } 638,
+{ 177: } 638,
+{ 178: } 643,
+{ 179: } 643
+);
+
+yygl : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 2,
+{ 2: } 17,
+{ 3: } 17,
+{ 4: } 17,
+{ 5: } 17,
+{ 6: } 17,
+{ 7: } 17,
+{ 8: } 17,
+{ 9: } 17,
+{ 10: } 17,
+{ 11: } 17,
+{ 12: } 24,
+{ 13: } 24,
+{ 14: } 24,
+{ 15: } 24,
+{ 16: } 24,
+{ 17: } 24,
+{ 18: } 26,
+{ 19: } 28,
+{ 20: } 30,
+{ 21: } 30,
+{ 22: } 30,
+{ 23: } 30,
+{ 24: } 30,
+{ 25: } 30,
+{ 26: } 30,
+{ 27: } 30,
+{ 28: } 33,
+{ 29: } 34,
+{ 30: } 36,
+{ 31: } 36,
+{ 32: } 37,
+{ 33: } 38,
+{ 34: } 39,
+{ 35: } 40,
+{ 36: } 40,
+{ 37: } 40,
+{ 38: } 40,
+{ 39: } 40,
+{ 40: } 40,
+{ 41: } 40,
+{ 42: } 40,
+{ 43: } 40,
+{ 44: } 40,
+{ 45: } 40,
+{ 46: } 42,
+{ 47: } 44,
+{ 48: } 46,
+{ 49: } 48,
+{ 50: } 50,
+{ 51: } 52,
+{ 52: } 54,
+{ 53: } 56,
+{ 54: } 56,
+{ 55: } 56,
+{ 56: } 56,
+{ 57: } 56,
+{ 58: } 57,
+{ 59: } 58,
+{ 60: } 59,
+{ 61: } 60,
+{ 62: } 61,
+{ 63: } 62,
+{ 64: } 63,
+{ 65: } 63,
+{ 66: } 63,
+{ 67: } 63,
+{ 68: } 63,
+{ 69: } 63,
+{ 70: } 63,
+{ 71: } 63,
+{ 72: } 63,
+{ 73: } 63,
+{ 74: } 66,
+{ 75: } 67,
+{ 76: } 68,
+{ 77: } 71,
+{ 78: } 74,
+{ 79: } 77,
+{ 80: } 80,
+{ 81: } 80,
+{ 82: } 80,
+{ 83: } 80,
+{ 84: } 81,
+{ 85: } 84,
+{ 86: } 87,
+{ 87: } 90,
+{ 88: } 90,
+{ 89: } 90,
+{ 90: } 90,
+{ 91: } 90,
+{ 92: } 90,
+{ 93: } 90,
+{ 94: } 90,
+{ 95: } 92,
+{ 96: } 92,
+{ 97: } 92,
+{ 98: } 92,
+{ 99: } 92,
+{ 100: } 92,
+{ 101: } 93,
+{ 102: } 94,
+{ 103: } 95,
+{ 104: } 98,
+{ 105: } 101,
+{ 106: } 104,
+{ 107: } 107,
+{ 108: } 110,
+{ 109: } 112,
+{ 110: } 112,
+{ 111: } 112,
+{ 112: } 112,
+{ 113: } 115,
+{ 114: } 115,
+{ 115: } 115,
+{ 116: } 115,
+{ 117: } 115,
+{ 118: } 115,
+{ 119: } 115,
+{ 120: } 115,
+{ 121: } 115,
+{ 122: } 115,
+{ 123: } 115,
+{ 124: } 116,
+{ 125: } 116,
+{ 126: } 119,
+{ 127: } 119,
+{ 128: } 119,
+{ 129: } 119,
+{ 130: } 120,
+{ 131: } 120,
+{ 132: } 120,
+{ 133: } 120,
+{ 134: } 121,
+{ 135: } 122,
+{ 136: } 122,
+{ 137: } 123,
+{ 138: } 123,
+{ 139: } 126,
+{ 140: } 126,
+{ 141: } 126,
+{ 142: } 126,
+{ 143: } 126,
+{ 144: } 126,
+{ 145: } 126,
+{ 146: } 127,
+{ 147: } 128,
+{ 148: } 129,
+{ 149: } 130,
+{ 150: } 130,
+{ 151: } 130,
+{ 152: } 130,
+{ 153: } 130,
+{ 154: } 130,
+{ 155: } 130,
+{ 156: } 131,
+{ 157: } 131,
+{ 158: } 131,
+{ 159: } 132,
+{ 160: } 133,
+{ 161: } 133,
+{ 162: } 135,
+{ 163: } 135,
+{ 164: } 135,
+{ 165: } 136,
+{ 166: } 136,
+{ 167: } 136,
+{ 168: } 137,
+{ 169: } 138,
+{ 170: } 139,
+{ 171: } 139,
+{ 172: } 139,
+{ 173: } 139,
+{ 174: } 139,
+{ 175: } 140,
+{ 176: } 141,
+{ 177: } 141,
+{ 178: } 141,
+{ 179: } 142
+);
+
+yygh : array [0..yynstates-1] of Integer = (
+{ 0: } 1,
+{ 1: } 16,
+{ 2: } 16,
+{ 3: } 16,
+{ 4: } 16,
+{ 5: } 16,
+{ 6: } 16,
+{ 7: } 16,
+{ 8: } 16,
+{ 9: } 16,
+{ 10: } 16,
+{ 11: } 23,
+{ 12: } 23,
+{ 13: } 23,
+{ 14: } 23,
+{ 15: } 23,
+{ 16: } 23,
+{ 17: } 25,
+{ 18: } 27,
+{ 19: } 29,
+{ 20: } 29,
+{ 21: } 29,
+{ 22: } 29,
+{ 23: } 29,
+{ 24: } 29,
+{ 25: } 29,
+{ 26: } 29,
+{ 27: } 32,
+{ 28: } 33,
+{ 29: } 35,
+{ 30: } 35,
+{ 31: } 36,
+{ 32: } 37,
+{ 33: } 38,
+{ 34: } 39,
+{ 35: } 39,
+{ 36: } 39,
+{ 37: } 39,
+{ 38: } 39,
+{ 39: } 39,
+{ 40: } 39,
+{ 41: } 39,
+{ 42: } 39,
+{ 43: } 39,
+{ 44: } 39,
+{ 45: } 41,
+{ 46: } 43,
+{ 47: } 45,
+{ 48: } 47,
+{ 49: } 49,
+{ 50: } 51,
+{ 51: } 53,
+{ 52: } 55,
+{ 53: } 55,
+{ 54: } 55,
+{ 55: } 55,
+{ 56: } 55,
+{ 57: } 56,
+{ 58: } 57,
+{ 59: } 58,
+{ 60: } 59,
+{ 61: } 60,
+{ 62: } 61,
+{ 63: } 62,
+{ 64: } 62,
+{ 65: } 62,
+{ 66: } 62,
+{ 67: } 62,
+{ 68: } 62,
+{ 69: } 62,
+{ 70: } 62,
+{ 71: } 62,
+{ 72: } 62,
+{ 73: } 65,
+{ 74: } 66,
+{ 75: } 67,
+{ 76: } 70,
+{ 77: } 73,
+{ 78: } 76,
+{ 79: } 79,
+{ 80: } 79,
+{ 81: } 79,
+{ 82: } 79,
+{ 83: } 80,
+{ 84: } 83,
+{ 85: } 86,
+{ 86: } 89,
+{ 87: } 89,
+{ 88: } 89,
+{ 89: } 89,
+{ 90: } 89,
+{ 91: } 89,
+{ 92: } 89,
+{ 93: } 89,
+{ 94: } 91,
+{ 95: } 91,
+{ 96: } 91,
+{ 97: } 91,
+{ 98: } 91,
+{ 99: } 91,
+{ 100: } 92,
+{ 101: } 93,
+{ 102: } 94,
+{ 103: } 97,
+{ 104: } 100,
+{ 105: } 103,
+{ 106: } 106,
+{ 107: } 109,
+{ 108: } 111,
+{ 109: } 111,
+{ 110: } 111,
+{ 111: } 111,
+{ 112: } 114,
+{ 113: } 114,
+{ 114: } 114,
+{ 115: } 114,
+{ 116: } 114,
+{ 117: } 114,
+{ 118: } 114,
+{ 119: } 114,
+{ 120: } 114,
+{ 121: } 114,
+{ 122: } 114,
+{ 123: } 115,
+{ 124: } 115,
+{ 125: } 118,
+{ 126: } 118,
+{ 127: } 118,
+{ 128: } 118,
+{ 129: } 119,
+{ 130: } 119,
+{ 131: } 119,
+{ 132: } 119,
+{ 133: } 120,
+{ 134: } 121,
+{ 135: } 121,
+{ 136: } 122,
+{ 137: } 122,
+{ 138: } 125,
+{ 139: } 125,
+{ 140: } 125,
+{ 141: } 125,
+{ 142: } 125,
+{ 143: } 125,
+{ 144: } 125,
+{ 145: } 126,
+{ 146: } 127,
+{ 147: } 128,
+{ 148: } 129,
+{ 149: } 129,
+{ 150: } 129,
+{ 151: } 129,
+{ 152: } 129,
+{ 153: } 129,
+{ 154: } 129,
+{ 155: } 130,
+{ 156: } 130,
+{ 157: } 130,
+{ 158: } 131,
+{ 159: } 132,
+{ 160: } 132,
+{ 161: } 134,
+{ 162: } 134,
+{ 163: } 134,
+{ 164: } 135,
+{ 165: } 135,
+{ 166: } 135,
+{ 167: } 136,
+{ 168: } 137,
+{ 169: } 138,
+{ 170: } 138,
+{ 171: } 138,
+{ 172: } 138,
+{ 173: } 138,
+{ 174: } 139,
+{ 175: } 140,
+{ 176: } 140,
+{ 177: } 140,
+{ 178: } 141,
+{ 179: } 141
+);
+
+yyr : array [1..yynrules] of YYRRec = (
+{ 1: } ( len: 0; sym: -12 ),
+{ 2: } ( len: 2; sym: -12 ),
+{ 3: } ( len: 1; sym: -13 ),
+{ 4: } ( len: 1; sym: -13 ),
+{ 5: } ( len: 1; sym: -14 ),
+{ 6: } ( len: 1; sym: -14 ),
+{ 7: } ( len: 1; sym: -14 ),
+{ 8: } ( len: 1; sym: -14 ),
+{ 9: } ( len: 1; sym: -14 ),
+{ 10: } ( len: 1; sym: -14 ),
+{ 11: } ( len: 0; sym: -23 ),
+{ 12: } ( len: 5; sym: -17 ),
+{ 13: } ( len: 0; sym: -24 ),
+{ 14: } ( len: 5; sym: -18 ),
+{ 15: } ( len: 0; sym: -25 ),
+{ 16: } ( len: 5; sym: -19 ),
+{ 17: } ( len: 0; sym: -27 ),
+{ 18: } ( len: 7; sym: -20 ),
+{ 19: } ( len: 0; sym: -26 ),
+{ 20: } ( len: 9; sym: -26 ),
+{ 21: } ( len: 9; sym: -26 ),
+{ 22: } ( len: 3; sym: -26 ),
+{ 23: } ( len: 3; sym: -26 ),
+{ 24: } ( len: 3; sym: -26 ),
+{ 25: } ( len: 3; sym: -26 ),
+{ 26: } ( len: 3; sym: -26 ),
+{ 27: } ( len: 0; sym: -28 ),
+{ 28: } ( len: 6; sym: -28 ),
+{ 29: } ( len: 6; sym: -28 ),
+{ 30: } ( len: 0; sym: -29 ),
+{ 31: } ( len: 0; sym: -32 ),
+{ 32: } ( len: 7; sym: -29 ),
+{ 33: } ( len: 0; sym: -31 ),
+{ 34: } ( len: 5; sym: -31 ),
+{ 35: } ( len: 4; sym: -30 ),
+{ 36: } ( len: 3; sym: -33 ),
+{ 37: } ( len: 5; sym: -33 ),
+{ 38: } ( len: 0; sym: -34 ),
+{ 39: } ( len: 5; sym: -21 ),
+{ 40: } ( len: 0; sym: -35 ),
+{ 41: } ( len: 7; sym: -21 ),
+{ 42: } ( len: 0; sym: -36 ),
+{ 43: } ( len: 6; sym: -16 ),
+{ 44: } ( len: 0; sym: -37 ),
+{ 45: } ( len: 2; sym: -37 ),
+{ 46: } ( len: 3; sym: -38 ),
+{ 47: } ( len: 2; sym: -38 ),
+{ 48: } ( len: 1; sym: -8 ),
+{ 49: } ( len: 1; sym: -8 ),
+{ 50: } ( len: 1; sym: -8 ),
+{ 51: } ( len: 1; sym: -8 ),
+{ 52: } ( len: 1; sym: -8 ),
+{ 53: } ( len: 1; sym: -8 ),
+{ 54: } ( len: 1; sym: -8 ),
+{ 55: } ( len: 1; sym: -8 ),
+{ 56: } ( len: 1; sym: -8 ),
+{ 57: } ( len: 1; sym: -8 ),
+{ 58: } ( len: 1; sym: -8 ),
+{ 59: } ( len: 1; sym: -7 ),
+{ 60: } ( len: 1; sym: -7 ),
+{ 61: } ( len: 0; sym: -22 ),
+{ 62: } ( len: 2; sym: -22 ),
+{ 63: } ( len: 4; sym: -39 ),
+{ 64: } ( len: 2; sym: -39 ),
+{ 65: } ( len: 2; sym: -39 ),
+{ 66: } ( len: 1; sym: -39 ),
+{ 67: } ( len: 1; sym: -39 ),
+{ 68: } ( len: 1; sym: -39 ),
+{ 69: } ( len: 1; sym: -39 ),
+{ 70: } ( len: 1; sym: -39 ),
+{ 71: } ( len: 1; sym: -39 ),
+{ 72: } ( len: 1; sym: -39 ),
+{ 73: } ( len: 4; sym: -15 ),
+{ 74: } ( len: 1; sym: -2 ),
+{ 75: } ( len: 1; sym: -4 ),
+{ 76: } ( len: 1; sym: -3 ),
+{ 77: } ( len: 3; sym: -3 ),
+{ 78: } ( len: 2; sym: -3 ),
+{ 79: } ( len: 2; sym: -3 ),
+{ 80: } ( len: 3; sym: -3 ),
+{ 81: } ( len: 3; sym: -3 ),
+{ 82: } ( len: 3; sym: -3 ),
+{ 83: } ( len: 3; sym: -3 ),
+{ 84: } ( len: 3; sym: -3 ),
+{ 85: } ( len: 3; sym: -3 ),
+{ 86: } ( len: 3; sym: -3 ),
+{ 87: } ( len: 3; sym: -3 ),
+{ 88: } ( len: 1; sym: -5 ),
+{ 89: } ( len: 1; sym: -5 ),
+{ 90: } ( len: 1; sym: -11 ),
+{ 91: } ( len: 1; sym: -6 ),
+{ 92: } ( len: 1; sym: -6 ),
+{ 93: } ( len: 1; sym: -6 ),
+{ 94: } ( len: 1; sym: -6 ),
+{ 95: } ( len: 1; sym: -6 ),
+{ 96: } ( len: 0; sym: -40 ),
+{ 97: } ( len: 2; sym: -9 ),
+{ 98: } ( len: 0; sym: -41 ),
+{ 99: } ( len: 4; sym: -9 ),
+{ 100: } ( len: 0; sym: -10 ),
+{ 101: } ( len: 1; sym: -10 ),
+{ 102: } ( len: 1; sym: -10 )
+);
+
+
+const _error = 256; (* error token *)
+
+function yyact(state, sym : Integer; var act : Integer) : Boolean;
+  (* search action table *)
+  var k : Integer;
+  begin
+    k := yyal[state];
+    while (k<=yyah[state]) and (yya[k].sym<>sym) do inc(k);
+    if k>yyah[state] then
+      yyact := false
+    else
+      begin
+        act := yya[k].act;
+        yyact := true;
+      end;
+  end(*yyact*);
+
+function yygoto(state, sym : Integer; var nstate : Integer) : Boolean;
+  (* search goto table *)
+  var k : Integer;
+  begin
+    k := yygl[state];
+    while (k<=yygh[state]) and (yyg[k].sym<>sym) do inc(k);
+    if k>yygh[state] then
+      yygoto := false
+    else
+      begin
+        nstate := yyg[k].act;
+        yygoto := true;
+      end;
+  end(*yygoto*);
+
+label parse, next, error, errlab, shift, reduce, accept, abort;
+
+begin(*yyparse*)
+
+  (* initialize: *)
+
+  yystate := 0; yychar := -1; yynerrs := 0; yyerrflag := 0; yysp := 0;
+
+{$ifdef yydebug}
+  yydebug := true;
+{$else}
+  yydebug := false;
+{$endif}
+
+parse:
+
+  (* push state and value: *)
+
+  inc(yysp);
+  if yysp>yymaxdepth then
+    begin
+      yyerror('yyparse stack overflow');
+      goto abort;
+    end;
+  yys[yysp] := yystate; yyv[yysp] := yyval;
+
+next:
+
+  if (yyd[yystate]=0) and (yychar=-1) then
+    (* get next symbol *)
+    begin
+      yychar := yylex; if yychar<0 then yychar := 0;
+    end;
+
+  if yydebug then writeln('state ', yystate, ', char ', yychar);
+
+  (* determine parse action: *)
+
+  yyn := yyd[yystate];
+  if yyn<>0 then goto reduce; (* simple state *)
+
+  (* no default action; search parse table *)
+
+  if not yyact(yystate, yychar, yyn) then goto error
+  else if yyn>0 then                      goto shift
+  else if yyn<0 then                      goto reduce
+  else                                    goto accept;
+
+error:
+
+  (* error; start error recovery: *)
+
+  if yyerrflag=0 then yyerror('syntax error');
+
+errlab:
+
+  if yyerrflag=0 then inc(yynerrs);     (* new error *)
+
+  if yyerrflag<=2 then                  (* incomplete recovery; try again *)
+    begin
+      yyerrflag := 3;
+      (* uncover a state with shift action on error token *)
+      while (yysp>0) and not ( yyact(yys[yysp], _error, yyn) and
+                               (yyn>0) ) do
+        begin
+          if yydebug then
+            if yysp>1 then
+              writeln('error recovery pops state ', yys[yysp], ', uncovers ',
+                      yys[yysp-1])
+            else
+              writeln('error recovery fails ... abort');
+          dec(yysp);
+        end;
+      if yysp=0 then goto abort; (* parser has fallen from stack; abort *)
+      yystate := yyn;            (* simulate shift on error *)
+      goto parse;
+    end
+  else                                  (* no shift yet; discard symbol *)
+    begin
+      if yydebug then writeln('error recovery discards char ', yychar);
+      if yychar=0 then goto abort; (* end of input; abort *)
+      yychar := -1; goto next;     (* clear lookahead char and try again *)
+    end;
+
+shift:
+
+  (* go to new state, clear lookahead character: *)
+
+  yystate := yyn; yychar := -1; yyval := yylval;
+  if yyerrflag>0 then dec(yyerrflag);
+
+  goto parse;
+
+reduce:
+
+  (* execute action, pop rule from stack, and go to next state: *)
+
+  if yydebug then writeln('reduce ', -yyn);
+
+  yyflag := yyfnone; yyaction(-yyn);
+  dec(yysp, yyr[-yyn].len);
+  if yygoto(yys[yysp], yyr[-yyn].sym, yyn) then yystate := yyn;
+
+  (* handle action calls to yyaccept, yyabort and yyerror: *)
+
+  case yyflag of
+    yyfaccept : goto accept;
+    yyfabort  : goto abort;
+    yyferror  : goto errlab;
+  end;
+
+  goto parse;
+
+accept:
+
+  yyparse := 0; exit;
+
+abort:
+
+  yyparse := 1; exit;
+
+end(*yyparse*);
+
+
+{$I rclex.inc}
+begin
+  bufptr:= 0;
+  lexlib.get_char:= @rc_get_char;
+  lexlib.unget_char:= @rc_unget_char;
+end.

+ 234 - 0
packages/fcl-res/src/rcparser.y

@@ -0,0 +1,234 @@
+%{
+(*
+Vorspann
+ ****************************************************************************)
+
+unit rcparser;
+
+{$I rcparserfn.inc}
+
+%}
+
+%token _ILLEGAL
+%token _NUMBER _QUOTEDSTR _QUOTEDSTRL
+%token _STR_StringFileInfo _STR_VarFileInfo _STR_Translation
+%token _BEGIN _END _ID
+%token _LANGUAGE _CHARACTERISTICS _VERSION _MOVEABLE _FIXED _PURE _IMPURE _PRELOAD _LOADONCALL _DISCARDABLE
+%token _BITMAP _CURSOR _ICON _STRINGTABLE _VERSIONINFO
+%token _ANICURSOR _ANIICON _DLGINCLUDE _DLGINIT _HTML _MANIFEST _MESSAGETABLE _PLUGPLAY _RCDATA _VXD
+%token _FILEVERSION _PRODUCTVERSION _FILEFLAGSMASK _FILEFLAGS _FILEOS _FILETYPE _FILESUBTYPE _BLOCK _VALUE
+%token _ACCELERATORS _DIALOG _DIALOGEX _MENU _MENUEX
+
+%type <rcnumtype> numpos numexpr numeral
+%type <rcstrtype> ident_string long_string
+%type <TResourceDesc> resid rcdataid
+%type <TMemoryStream> raw_data raw_item
+%type <TFileStream> filename_string
+
+%left '|'
+%left '^'
+%left '&'
+%left '+' '-'
+%left '*' '/' '%'
+%right '~' _NUMNEG
+
+%%
+
+rcfile
+    : /* empty */
+    | rcfile defnstatement
+    ;
+
+defnstatement
+    : resourcedef
+    | languagedef
+    ;
+
+resourcedef
+    : res_stringtable
+    | res_bitmap
+    | res_cursor
+    | res_icon
+    | res_version
+    | res_rcdata
+    ;
+
+res_bitmap
+    : resid _BITMAP { create_resource($1, RT_BITMAP); } suboptions filename_string            { TBitmapResource(aktresource).SetCustomBitmapDataStream($5); }
+
+res_cursor
+    : resid _CURSOR { create_resource($1, RT_CURSOR); } suboptions filename_string            { TGroupCursorResource(aktresource).SetCustomItemDataStream($5); }
+
+res_icon
+    : resid _ICON { create_resource($1, RT_ICON); } suboptions filename_string                { TGroupIconResource(aktresource).SetCustomItemDataStream($5); }
+
+res_version
+    : resid _VERSIONINFO { create_resource($1, RT_VERSION); } version_fixed _BEGIN version_blocks _END
+
+version_fixed
+    : /* empty */
+    | version_fixed _FILEVERSION numeral ',' numeral ',' numeral ',' numeral                  { TVersionResource(aktresource).FixedInfo.FileVersion:= make_version($3.v, $5.v, $7.v, $9.v); }
+    | version_fixed _PRODUCTVERSION numeral ',' numeral ',' numeral ',' numeral               { TVersionResource(aktresource).FixedInfo.ProductVersion:= make_version($3.v, $5.v, $7.v, $9.v); }
+    | version_fixed _FILEFLAGSMASK numpos                                                     { TVersionResource(aktresource).FixedInfo.FileFlagsMask:= $3.v; }
+    | version_fixed _FILEFLAGS numpos                                                         { TVersionResource(aktresource).FixedInfo.FileFlags:= $3.v; }
+    | version_fixed _FILEOS numpos                                                            { TVersionResource(aktresource).FixedInfo.FileOS:= $3.v; }
+    | version_fixed _FILETYPE numpos                                                          { TVersionResource(aktresource).FixedInfo.FileType:= $3.v; }
+    | version_fixed _FILESUBTYPE numpos                                                       { TVersionResource(aktresource).FixedInfo.FileSubType:= $3.v; }
+    ;
+
+version_blocks
+    : /* empty */
+    | version_blocks _BLOCK _STR_StringFileInfo _BEGIN ver_strings_lang _END
+    | version_blocks _BLOCK _STR_VarFileInfo _BEGIN ver_translation_data _END
+    ;
+
+ver_strings_lang
+    : /* empty */
+    | ver_strings_lang _BLOCK long_string _BEGIN                                              { version_string_tab_begin($3.v^); }
+                                          ver_strings_data _END
+    ;
+
+ver_strings_data
+    : /* empty */
+    | ver_strings_data _VALUE long_string ',' long_string                                     { version_string_tab_add($3.v^, $5.v^); }
+    ;
+
+ver_translation_data
+    : _VALUE _STR_Translation ',' ver_translation_pair
+    ;
+
+ver_translation_pair
+    : numeral ',' numeral                                                                     { version_var_translation_add($1.v, $3.v); }
+    | ver_translation_pair ',' numeral ',' numeral                                            { version_var_translation_add($3.v, $5.v); }
+    ;
+
+res_rcdata
+    : resid rcdataid { create_resource($1, $2); } suboptions filename_string                  { aktresource.SetCustomRawDataStream($5); }
+    | resid rcdataid { create_resource($1, $2); } suboptions _BEGIN raw_data _END             { aktresource.SetCustomRawDataStream($6); }
+    ;
+
+res_stringtable
+    : _STRINGTABLE { stringtable_begin(); } suboptions _BEGIN stringtable_data _END { stringtable_end(); }
+
+stringtable_data
+    : /* empty */
+    | stringtable_data stringtable_entry
+    ;
+
+stringtable_entry
+    : numeral ',' long_string                      { stringtable_add($1.v, $3.v^); }
+    | numeral long_string                          { stringtable_add($1.v, $2.v^); }
+    ;
+
+rcdataid
+    : _ANICURSOR                                   { $$:= TResourceDesc.Create(RT_ANICURSOR); }
+    | _ANIICON                                     { $$:= TResourceDesc.Create(RT_ANIICON); }
+    | _DLGINCLUDE                                  { $$:= TResourceDesc.Create(RT_DLGINCLUDE); }
+    | _DLGINIT                                     { $$:= TResourceDesc.Create(RT_DLGINIT); }
+    | _HTML                                        { $$:= TResourceDesc.Create(23); }
+    | _MANIFEST                                    { $$:= TResourceDesc.Create(RT_MANIFEST); }
+    | _MESSAGETABLE                                { $$:= TResourceDesc.Create(RT_MESSAGETABLE); }
+    | _PLUGPLAY                                    { $$:= TResourceDesc.Create(RT_PLUGPLAY); }
+    | _RCDATA                                      { $$:= TResourceDesc.Create(RT_RCDATA); }
+    | _VXD                                         { $$:= TResourceDesc.Create(RT_VXD); }
+    | resid
+    ;
+
+resid
+    : numpos                                       { $$:= TResourceDesc.Create($1.v); }
+    | ident_string                                 { $$:= TResourceDesc.Create($1.v^); }
+    ;
+
+suboptions
+    : /* empty */
+    | suboptions suboption
+    ;
+
+suboption
+    : _LANGUAGE numpos ',' numpos                  { change_lang_id(MakeLangID($2.v, $4.v)); }
+    | _CHARACTERISTICS numpos                      { aktresource.Characteristics:= $2.v; }
+    | _VERSION numpos                              { aktresource.Version:= $2.v; }
+    | _MOVEABLE                                    { aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_MOVEABLE; }
+    | _FIXED                                       { aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_MOVEABLE; }
+    | _PURE                                        { aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PURE; }
+    | _IMPURE                                      { aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PURE; }
+    | _PRELOAD                                     { aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PRELOAD; }
+    | _LOADONCALL                                  { aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PRELOAD; }
+    | _DISCARDABLE                                 { aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_DISCARDABLE; }
+    ;
+
+languagedef
+    : _LANGUAGE numpos ',' numpos                  { language:= MakeLangID($2.v, $4.v); }
+
+numpos
+    : numexpr
+    ;
+
+numeral
+    : _NUMBER                                      { $$:= str_to_num(yytext); }
+    ;
+
+numexpr
+    : numeral
+    | '(' numexpr ')'                              { $$:= $2; }
+    | '~' numexpr %prec '~'                        { $$.v:= not $2.v; $$.long:= $2.long; }
+    | '-' numexpr %prec _NUMNEG                    { $$.v:= -$2.v; $$.long:= $2.long; }
+    | numexpr '*' numexpr                          { $$.v:= $1.v * $3.v; $$.long:= $1.long or $3.long; }
+    | numexpr '/' numexpr                          { $$.v:= $1.v div Max(1, $3.v); $$.long:= $1.long or $3.long; }
+    | numexpr '%' numexpr                          { $$.v:= $1.v mod Max(1, $3.v); $$.long:= $1.long or $3.long; }
+    | numexpr '+' numexpr                          { $$.v:= $1.v + $3.v; $$.long:= $1.long or $3.long; }
+    | numexpr '-' numexpr                          { $$.v:= $1.v - $3.v; $$.long:= $1.long or $3.long; }
+    | numexpr '&' numexpr                          { $$.v:= $1.v and $3.v; $$.long:= $1.long or $3.long; }
+    | numexpr '^' numexpr                          { $$.v:= $1.v xor $3.v; $$.long:= $1.long or $3.long; }
+    | numexpr '|' numexpr                          { $$.v:= $1.v or $3.v; $$.long:= $1.long or $3.long; }
+    ;
+
+ident_string
+    : _ID                                          { string_new($$, yytext, opt_code_page); }
+    | long_string
+    ;
+
+filename_string
+    : long_string                                  { $$:= TFileStream.Create($1.v^, fmOpenRead or fmShareDenyWrite); }
+    ;
+
+long_string
+    : _QUOTEDSTR                                   { string_new_uni($$, @strbuf[0], strbuflen, opt_code_page, true); }
+    | _QUOTEDSTRL                                  { string_new_uni($$, @strbuf[0], strbuflen, CP_UTF16, true); }
+    | _STR_StringFileInfo                          { string_new($$, yytext, opt_code_page); }
+    | _STR_VarFileInfo                             { string_new($$, yytext, opt_code_page); }
+    | _STR_Translation                             { string_new($$, yytext, opt_code_page); }
+    ;
+
+raw_data
+    :                                              { $$:= TMemoryStream.Create; }
+      raw_item
+    | raw_data ',' { $$:= $1; } raw_item
+    ;
+
+raw_item
+    : /* empty */
+      {
+        $$:= $<TMemoryStream>0;
+      }
+    | long_string
+      {
+        $$:= $<TMemoryStream>0;
+        raw_write_string($$, $1);
+      }
+    | numeral
+      {
+        $$:= $<TMemoryStream>0;
+        raw_write_int($$, $1);
+      }
+    ;
+
+%%
+
+{$I rclex.inc}
+begin
+  bufptr:= 0;
+  lexlib.get_char:= @rc_get_char;
+  lexlib.unget_char:= @rc_unget_char;
+end.
+

+ 435 - 0
packages/fcl-res/src/rcparserfn.inc

@@ -0,0 +1,435 @@
+{%MainUnit rcparser.pas}
+
+interface
+
+{$mode objfpc}{$H+}
+{$COPERATORS ON}
+{$GOTO ON}
+
+uses
+  SysUtils, Classes, StrUtils, fgl, lexlib, yacclib, resource,
+  acceleratorsresource, groupiconresource, stringtableresource,
+  bitmapresource, versionresource, versiontypes, groupcursorresource;
+
+type
+  TStringHashTable = specialize TFPGMap<String, String>;
+
+function yyparse : Integer;
+
+var
+  aktresources: TResources;
+  opt_code_page: TSystemCodePage;
+  yyfilename: AnsiString;
+  yyparseresult: YYSType;
+
+procedure DisposePools;
+procedure SetDefaults;
+procedure PragmaCodePage(cp: string);
+
+{$DEFINE INC_HEADER}
+{$I yyinclude.pp}
+{$I yypreproc.pp}
+{$UNDEF INC_HEADER}
+
+implementation
+
+procedure yyerror ( msg : String );
+begin
+  writeln(ErrOutput, yyfilename, '(',yylineno,':',yycolno,'): at "',yytext,'": ', msg);
+  WriteLn(ErrOutput, yyline);
+  WriteLn(ErrOutput, '^':yycolno);
+end(*yyerrmsg*);
+
+{$I yyinclude.pp}
+{$I yypreproc.pp}
+
+(* I/O routines: *)
+
+const nl = #10;  (* newline character *)
+
+const max_chars = 2048;
+
+var
+  bufptr : Integer;
+  buf    : array [1..max_chars] of Char;
+
+function rc_get_char : Char;
+  var i : Integer;
+      ok : boolean;
+  begin
+    if (bufptr=0) and not eof(yyinput) then
+      begin
+        repeat
+          readln(yyinput, yyline);
+          inc(yylineno); yycolno := 1;
+          ok:= ypreproc.useline(yyline);
+        until (ok or eof(yyinput));
+        if ok then begin
+          buf[1] := nl;
+          for i := 1 to length(yyline) do
+            buf[i+1] := yyline[length(yyline)-i+1];
+          inc(bufptr, length(yyline)+1);
+        end;
+      end;
+    if bufptr>0 then
+      begin
+        rc_get_char := buf[bufptr];
+        dec(bufptr);
+        inc(yycolno);
+      end
+    else
+      rc_get_char := #0;
+  end(*get_char*);
+
+procedure rc_unget_char ( c : Char );
+  begin
+    if bufptr=max_chars then yyerror('input buffer overflow');
+    inc(bufptr);
+    dec(yycolno);
+    buf[bufptr] := c;
+  end(*unget_char*);
+
+procedure unget_string(s: string);
+var
+  i: integer;
+begin
+  for i:= Length(s) downto 1 do
+    rc_unget_char(s[i]);
+end;
+
+procedure PragmaCodePage(cp: string);
+var cpi: integer;
+begin
+  if Uppercase(cp) = 'DEFAULT' then
+    opt_code_page:= DefaultFileSystemCodePage
+  else begin
+    if TryStrToInt(cp, cpi) and (cpi>=0) and (cpi<=high(TSystemCodePage)) then
+      opt_code_page:= cpi
+    else
+      yyerror('Invalid code_page pragma: "' + cp + '"');
+  end;
+end;
+
+type
+  rcnumtype = record
+    v: LongWord;
+    long: boolean;
+  end;
+
+  rcstrtype = record
+    v: PUnicodeString;
+    cp: TSystemCodePage;
+  end;
+
+function str_to_cbase(s: string): LongWord;
+begin
+  if s = '0' then
+    Exit(0);
+  if Copy(s, 1, 2) = '0x' then
+    Exit(StrToInt('$' + Copy(s, 3, Maxint)));
+  if Copy(s, 1, 2) = '0o' then
+    Exit(StrToInt('&' + Copy(s, 3, Maxint)));
+  if Copy(s, 1, 1) = '0' then
+    Exit(StrToInt('&' + Copy(s, 2, Maxint)));
+  Result:= StrToInt(s);
+end;
+
+function str_to_num(s:string): rcnumtype;
+begin
+  // this does not handle empty strings - should never get them from the lexer
+  Result.long:= s[Length(s)] = 'L';
+  if Result.long then
+    setlength(s, Length(s) - 1);
+  Result.v:= str_to_cbase(s);
+end;
+
+type
+  PStrPoolItem = ^TStrPoolItem;
+  TStrPoolItem = record
+    str: PUnicodeString;
+    next: PStrPoolItem;
+  end;
+
+const
+  MAX_RCSTR_LEN = 4096;
+var
+  strbuf: array[0..MAX_RCSTR_LEN + 1] of char;
+  strbuflen: Integer;
+  stringpool: PStrPoolItem = nil;
+
+procedure strbuf_begin();
+begin
+  FillChar(strbuf[0], sizeof(strbuf), 0);
+  strbuflen:= 0;
+end;
+
+procedure strbuf_append(s: string);
+var
+  rem: integer;
+begin
+  rem:= MAX_RCSTR_LEN - strbuflen;
+  if Length(s) < rem then
+    rem:= Length(s);
+  Move(s[1], strbuf[strbuflen], rem);
+  inc(strbuflen, rem);
+end;
+
+procedure string_new(var str: rcstrtype; val: UnicodeString; cp: TSystemCodePage);
+var
+  s: PStrPoolItem;
+begin
+  New(str.v);
+  str.v^:= val;
+  str.cp:= cp;
+
+  New(s);
+  s^.next:= stringpool;
+  s^.str:= str.v;
+  stringpool:= s;
+end;
+
+procedure string_new_uni(var str: rcstrtype; val: PAnsiChar; len: integer; cp: TSystemCodePage; escapes: boolean);
+  function translateChar(c: AnsiChar): UnicodeChar;
+  var
+    u: UnicodeString = '';
+  begin
+    if cp = CP_UTF16 then
+      Result:= c
+    else begin
+      // TODO: there has to be a better way to translate a single codepoint
+      widestringmanager.Ansi2UnicodeMoveProc(@c, cp, u, 1);
+      Result:= u[1];
+    end;
+  end;
+
+var
+  uni: UnicodeString;
+  wc: PUnicodeChar;
+  rc, endin: PAnsiChar;
+  h: string;
+  hexlen, i: integer;
+begin
+  uni:= '';
+  if not escapes then
+    widestringmanager.Ansi2UnicodeMoveProc(val, cp, uni, len)
+  else begin
+    if cp = CP_UTF16 then
+      hexlen:= 4
+    else
+      hexlen:= 2;
+    setlength(uni, len);
+    wc:= @uni[1];
+    rc:= val;
+    endin:= @val[len];
+    while rc < endin do begin
+      if (rc^ = '\') then begin
+        inc(rc);
+        case rc^ of
+          #0: exit {Error: End too soon};
+          '\': wc^:= '\';
+          'f': wc^:= #&14;
+          'n': wc^:= #&12;
+          'r': wc^:= #&15;
+          't': wc^:= #&11;
+          'x',
+          'X': begin
+            h:= '$';
+            for i:= 1 to hexlen do begin
+              inc(rc);
+              if rc >= endin then
+                exit {Error: End too soon};
+              h += rc^;
+            end;
+            if cp = CP_UTF16 then
+              wc^:= WideChar(StrToInt(h))
+            else
+              wc^:= translateChar(Char(StrToInt(h)));
+          end;
+          '0'..'7': begin
+            h:= '&' + rc^;
+            for i:= 2 to 3 do begin
+              inc(rc);
+              if (rc >= endin) or not (rc^ in ['0'..'7']) then begin
+                dec(rc);
+                break;
+              end;
+              h += rc^;
+            end;
+            if cp = CP_UTF16 then
+              wc^:= WideChar(StrToInt(h))
+            else
+              wc^:= translateChar(Char(StrToInt(h)));
+          end;
+        else
+          wc^:= translateChar(rc^);
+        end;
+      end else
+        wc^:= translateChar(rc^);
+      inc(wc);
+      inc(rc);
+    end;
+    i:= (PtrUInt(wc) - PtrUInt(@uni[1])) div SizeOf(WideChar);
+    SetLength(uni, i);
+  end;
+  string_new(str, uni, cp);
+end;
+
+function Max(a, b: LongWord): LongWord; inline;
+begin
+  if a > b then
+    Result:= a
+  else
+    Result:= b;
+end;
+
+var
+  aktresource: TAbstractResource;
+  language: TLangID;
+
+procedure create_resource(aId, aType: TResourceDesc; aClass: TResourceClass);
+var
+  r: TAbstractResource;
+begin
+  r:= aClass.Create(aType, aId);
+  r.LangID:= language;
+  aktresources.Add(r);
+  aktresource:= r;
+  aId.Free;
+  aType.Free;
+end;
+
+procedure create_resource(aId, aType: TResourceDesc); overload;
+begin
+  create_resource(aId, aType, TGenericResource);
+end;
+
+procedure create_resource(aId: TResourceDesc; aType: Word); overload;
+var
+  cls: TResourceClass;
+begin
+  case aType of
+    RT_BITMAP: cls:= TBitmapResource;
+    RT_ICON: cls:= TGroupIconResource;
+    RT_CURSOR: cls:= TGroupCursorResource;
+    RT_VERSION: cls:= TVersionResource;
+  else
+    raise EResourceDescTypeException.CreateFmt('Resource type not supported: %d', [aType]);
+  end;
+  create_resource(aId, nil, cls);
+end;
+
+procedure change_lang_id(newlang: TLangID);
+begin
+  // cannot change a language id while it is contained in a list, so remove and re-add
+  aktresources.Remove(aktresource);
+  aktresource.LangID:= newlang;
+  aktresources.Add(aktresource);
+end;
+
+procedure raw_write_string(Stream: TMemoryStream; str: rcstrtype);
+var
+  i: integer;
+  u: UnicodeString;
+  r: RawByteString = '';
+begin
+  u:= str.v^;
+  if str.cp = CP_UTF16 then begin
+    for i:=1 to length(u) do
+      Stream.WriteWord(NtoLE(Word(u[i])));
+  end else begin
+    widestringmanager.Unicode2AnsiMoveProc(@u[1], r, str.cp, Length(u));
+    Stream.WriteBuffer(r[1], Length(r));
+  end;
+end;
+
+procedure raw_write_int(Stream: TMemoryStream; num: rcnumtype);
+begin
+  if num.long then
+    Stream.WriteDWord(NtoLE(num.v))
+  else
+    Stream.WriteWord(NtoLE(Word(num.v)));
+end;
+
+procedure stringtable_begin();
+begin
+  // create dummy resource that we will use to capture suboptions
+  create_resource(TResourceDesc.create(1), TResourceDesc.create(1));
+  aktresources.Remove(aktresource);
+end;
+
+procedure stringtable_add(ident: Word; str: AnsiString);
+var
+  table: word;
+  r: TStringTableResource;
+begin
+  table:= (ident div 16) + 1;
+  try
+    { TODO : This is stupid }
+    r:= aktresources.Find(RT_STRING, table, aktresource.LangID) as TStringTableResource;
+  except
+    on e: EResourceNotFoundException do begin
+      r:= TStringTableResource.Create;
+      r.LangID:= aktresource.LangID;
+      r.MemoryFlags:= aktresource.MemoryFlags;
+      r.Characteristics:= aktresource.Characteristics;
+      r.Version:= aktresource.Version;
+      r.FirstID:= ident;
+      aktresources.Add(r);
+    end;
+  end;
+  r.Strings[ident]:= str;
+end;
+
+procedure stringtable_end();
+begin
+  FreeAndNil(aktresource);
+end;
+
+function make_version(a, b, c, d: Word): TFileProductVersion;
+begin
+  Result[0]:= a;
+  Result[1]:= b;
+  Result[2]:= c;
+  Result[3]:= d;
+end;
+
+procedure version_string_tab_begin(lcs: AnsiString);
+var
+  vst: TVersionStringTable;
+begin
+  vst:= TVersionStringTable.Create(lcs);
+  TVersionResource(aktresource).StringFileInfo.Add(vst);
+end;
+
+procedure version_string_tab_add(key, value: AnsiString);
+begin
+  TVersionResource(aktresource).StringFileInfo.Items[TVersionResource(aktresource).StringFileInfo.Count-1].Add(key, value);
+end;
+
+procedure version_var_translation_add(langid, cpid: word);
+var
+  ti: TVerTranslationInfo;
+begin
+  ti.language:= langid;
+  ti.codepage:= cpid;
+  TVersionResource(aktresource).VarFileInfo.Add(ti);
+end;
+
+procedure SetDefaults;
+begin
+  language:= $0409;                    // MS RC starts up as en-US
+  PragmaCodePage('DEFAULT');
+end;
+
+procedure DisposePools;
+var
+  s: PStrPoolItem;
+begin
+  while stringpool <> nil do begin
+    s:= stringpool;
+    stringpool:= s^.next;
+    dispose(s^.str);
+    dispose(s);
+  end;
+end;
+

+ 133 - 0
packages/fcl-res/src/rcreader.pp

@@ -0,0 +1,133 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2008 by Giulio Bernardi
+
+    Resource reader/compiler for MS RC script files
+
+    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.
+
+ **********************************************************************}
+
+unit rcreader;
+
+{$MODE OBJFPC} {$H+}
+
+interface
+
+uses
+  Classes, SysUtils, resource;
+
+type
+
+  { TRCResourceReader }
+
+  TRCResourceReader = class(TAbstractResourceReader)
+  private
+    fExtensions : string;
+    fDescription : string;
+    fRCIncludeDirs: TStringList;
+    fRCDefines: TStringList;
+  protected
+    function GetExtensions : string; override;
+    function GetDescription : string; override;
+    procedure Load(aResources : TResources; aStream : TStream); override;
+    function CheckMagic(aStream : TStream) : boolean; override;
+    procedure ReadRCFile(aResources : TResources; aLocation: String; aStream : TStream);
+  public
+    constructor Create; override;
+    destructor Destroy; override;
+    property RCIncludeDirs: TStringList read fRCIncludeDirs;
+    property RCDefines: TStringList read fRCDefines;
+  end;
+
+implementation
+
+uses
+  StreamIO, resdatastream, resfactory, lexlib, rcparser;
+
+{ TRCResourceReader }
+
+function TRCResourceReader.GetExtensions: string;
+begin
+  Result:=fExtensions;
+end;
+
+function TRCResourceReader.GetDescription: string;
+begin
+  Result:=fDescription;
+end;
+
+procedure TRCResourceReader.Load(aResources: TResources; aStream: TStream);
+var
+  fd: String;
+begin
+  if aStream is TFileStream then
+    fd:= ExtractFilePath(TFileStream(aStream).FileName)
+  else
+    fd:= IncludeTrailingPathDelimiter(GetCurrentDir);
+  try
+    ReadRCFile(aResources, fd, aStream);
+  except
+    on e : EReadError do
+      raise EResourceReaderUnexpectedEndOfStreamException.Create('');
+  end;
+end;
+
+function TRCResourceReader.CheckMagic(aStream: TStream): boolean;
+begin
+  { TODO : Check for Text-Only file }
+  Result:= True;
+end;
+
+procedure TRCResourceReader.ReadRCFile(aResources: TResources; aLocation: String; aStream: TStream);
+var
+  i: Integer;
+begin
+  AssignStream(lexlib.yyinput, aStream);
+  Reset(lexlib.yyinput);
+  try
+    rcparser.yyfilename:= '#MAIN.RC';
+    rcparser.SetDefaults;
+    SetTextCodePage(lexlib.yyinput, rcparser.opt_code_page);
+    rcparser.yinclude:= tyinclude.Create;
+    rcparser.yinclude.WorkDir:= aLocation;
+    rcparser.yinclude.SearchPaths.Assign(fRCIncludeDirs);
+    rcparser.ypreproc:= typreproc.Create;
+    rcparser.ypreproc.Defines.Add('RC_INVOKED', '');
+    for i:= 0 to fRCDefines.Count-1 do
+      rcparser.ypreproc.Defines.KeyData[fRCDefines.Names[i]]:= fRCDefines.ValueFromIndex[i];
+    rcparser.aktresources:= aResources;
+    if rcparser.yyparse <> 0 then
+      raise EReadError.Create('Parse Error');
+  finally
+    rcparser.DisposePools;
+    FreeAndNil(rcparser.ypreproc);
+    FreeAndNil(rcparser.yinclude);
+  end;
+end;
+
+constructor TRCResourceReader.Create;
+begin
+  fExtensions:='.rc';
+  fDescription:='RC script resource reader';
+  fRCDefines:= TStringList.Create;
+  fRCIncludeDirs:= TStringList.Create;
+end;
+
+destructor TRCResourceReader.Destroy;
+begin
+  fRCIncludeDirs.Free;
+  fRCDefines.Free;
+  inherited;
+end;
+
+initialization
+  { don't register automatically, as this is essentially a "catch all" }
+  //TResources.RegisterReader('.rc',TRCResourceReader);
+
+end.

+ 1 - 0
packages/fcl-res/src/resource.pp

@@ -44,6 +44,7 @@ const
   RT_ANIICON      = 22;  //Animated icon.
   RT_HTML         = 23;  //HTML.
   RT_MANIFEST     = 24;  //Microsoft Windows XP: Side-by-Side Assembly XML Manifest.
+  RT_DLGINIT      = 240; //Never present in compiled form
 
   CREATEPROCESS_MANIFEST_RESOURCE_ID                 = 1;
   ISOLATIONAWARE_MANIFEST_RESOURCE_ID                = 2;

+ 21 - 35
packages/fcl-res/src/stringtableresource.pp

@@ -21,13 +21,13 @@ interface
 
 uses
   Classes, SysUtils, resource;
-  
+
 type
   EStringTableResourceException = class(EResourceException);
   EStringTableNameNotAllowedException = class(EStringTableResourceException);
   EStringTableIndexOutOfBoundsException = class(EStringTableResourceException);
 
-  
+
 resourcestring
   SNameNotAllowed = 'Resource ID must be an ordinal in the range 1-4096';
   SIndexOutOfBounds = 'String ID out of bounds: %d';
@@ -42,7 +42,7 @@ type
     fName : TResourceDesc;
     fFirstID : word;
     fCount : integer;
-    fList : TStringList;
+    fList : array of UnicodeString;
     fCanChangeDesc : boolean;
     function IDtoIndex(const aId : word) : integer;
     procedure CheckListLoaded;
@@ -85,54 +85,47 @@ end;
 procedure TStringTableResource.CheckListLoaded;
 var i : integer;
 begin
-  if fList<>nil then exit;
-  fList:=TStringList.Create;
-  fList.Capacity:=16;
+  if Length(fList) <> 0 then exit;
+  SetLength(fList, fCount);
+  for i:=0 to high(fList) do
+    fList[i]:= '';
   if RawData.Size=0 then exit;
   RawData.Position:=0;
-  for i:=0 to 15 do
-    fList.Add(ReadWideString);
+  for i:=0 to high(fList) do
+    fList[i]:= ReadWideString;
 end;
 
 function TStringTableResource.ReadWideString: string;
-var ws : widestring;
+var ws : unicodestring;
     w : word;
     i : integer;
 begin
   RawData.ReadBuffer(w,2);
-  {$IFDEF ENDIAN_BIG}
-  w:=SwapEndian(w);
-  {$ENDIF}
+  w:= LEtoN(w);
   setlength(ws,w);
 
   for i:=1 to length(ws) do
   begin
     RawData.ReadBuffer(w,2);
-    {$IFDEF ENDIAN_BIG}
-    w:=SwapEndian(w);
-    {$ENDIF}
+    w:= LEtoN(w);
     ws[i]:=widechar(w);
   end;
   Result:=ws;
 end;
 
 procedure TStringTableResource.WriteWideString(const aString: string);
-var ws : widestring;
+var ws : unicodestring;
     w : word;
     i : integer;
 begin
   w:=length(aString);
-  {$IFDEF ENDIAN_BIG}
-  w:=SwapEndian(w);
-  {$ENDIF}
+  w:= NtoLE(w);
   RawData.WriteBuffer(w,2);
   ws:=aString;
   for i:=1 to length(ws) do
   begin
     w:=word(ws[i]);
-    {$IFDEF ENDIAN_BIG}
-    w:=SwapEndian(w);
-    {$ENDIF}
+    w:= NtoLE(w);
     RawData.WriteBuffer(w,2);
   end;
 end;
@@ -157,8 +150,8 @@ begin
   CheckIndex(id);
   CheckListLoaded;
   idx:=IDtoIndex(id);
-  if idx>=fList.Count then Result:=''
-  else Result:=fList[idx];
+  if idx>high(fList) then Result:= ''
+  else Result:= fList[idx];
 end;
 
 procedure TStringTableResource.SetString(id: word; aString: string);
@@ -167,13 +160,7 @@ begin
   CheckIndex(id);
   CheckListLoaded;
   idx:=IDtoIndex(id);
-  if idx<fList.Count then fList[idx]:=aString
-  else if idx>=fList.Count then
-  begin
-    for i:=fList.Count to idx-1 do
-      fList.Add('');
-    fList.Add(aString);
-  end;
+  fList[idx]:= aString;
 end;
 
 procedure TStringTableResource.UpdateRawData;
@@ -184,7 +171,7 @@ begin
   RawData.Position:=0;
   for i:=FirstID to LastID do
     WriteWideString(Strings[i]);
-  FreeAndNil(fList);
+  fList:= nil;
 end;
 
 function TStringTableResource.GetType: TResourceDesc;
@@ -223,7 +210,7 @@ constructor TStringTableResource.Create;
 begin
   inherited Create;
   fCanChangeDesc:=false;
-  fList:=nil;
+  fList:= nil;
   fType:=TResourceDesc.Create(RT_STRING);
   fName:=TResourceDesc.Create(1);
   fCount:=16;
@@ -248,8 +235,7 @@ destructor TStringTableResource.Destroy;
 begin
   fType.Free;
   fName.Free;
-  if fList<>nil then
-    fList.Free;
+  SetLength(fList, 0);
   inherited Destroy;
 end;
 

+ 127 - 0
packages/fcl-res/src/yyinclude.pp

@@ -0,0 +1,127 @@
+{%MainUnit rcparser.pas}
+
+{$IFDEF INC_HEADER}
+
+type
+  tyinclude = class
+  const
+    yi_maxlevels = 5;
+  var
+    stack: array[0..yi_maxlevels] of record
+      yyinput           : Text;        (* input and output file *)
+      yyline            : String;      (* current input line *)
+      yylineno, yycolno : Integer;     (* current input position *)
+      fn                : AnsiString;
+      prev_wrap         : yywrap_t;
+    end;
+    level: integer;
+    WorkDir: string;
+    SearchPaths: TStringList;
+  public
+    constructor Create;
+    destructor Destroy; override;
+    class function wrapone(): Boolean; static;
+    function push(const incfile: ansistring): Boolean;
+    function pop(): Boolean;
+    function expand(fn: AnsiString): AnsiString;
+  end;
+
+var
+  yinclude: tyinclude;
+
+{$ELSE}
+
+class function tyinclude.wrapone(): Boolean;
+begin
+  Result:= yinclude.pop;
+end;
+
+function tyinclude.push(const incfile: ansistring): Boolean;
+begin
+  stack[level].yyinput:= yyinput;
+  stack[level].yyline:= yyline;
+  stack[level].yylineno:= yylineno;
+  stack[level].yycolno:= yycolno;
+  stack[level].prev_wrap:= yywrap;
+  stack[level].fn:= yyfilename;
+  inc(level);
+  yywrap:= @tyinclude.wrapone;
+  AssignFile(yyinput, incfile);
+  Reset(yyinput);
+  yyfilename:= incfile;
+  yyline:= '';
+  yylineno:= 0;
+  yycolno:= 0;
+  {$if declared(ypreproc)}
+  ypreproc.newfile(yyfilename);
+  {$endif}
+  Result:= true;
+end;
+
+function tyinclude.pop(): Boolean;
+begin
+  Close(yyinput);
+  Result:= level = 0;
+  if not Result then begin
+    Dec(level);
+    yyinput:= stack[level].yyinput;
+    yyline:= stack[level].yyline;
+    yylineno:= stack[level].yylineno;
+    yycolno:= stack[level].yycolno;
+    yywrap:= stack[level].prev_wrap;
+    yyfilename:= stack[level].fn;
+    {$if declared(ypreproc)}
+    ypreproc.newfile(yyfilename);
+    {$endif}
+  end;
+end;
+
+function tyinclude.expand(fn: AnsiString): AnsiString;
+var
+  i: integer;
+  f: string;
+begin
+  result:= '';
+  if Length(fn) > 3 then begin
+    if (fn[1] = '<') and (fn[length(fn)] = '>') then begin
+      fn:= copy(fn, 2, Length(fn)-2);
+      for i:= 0 to SearchPaths.Count - 1 do begin
+        f:= ConcatPaths([SearchPaths[i], fn]);
+        if FileExists(f) then
+          Exit(f);
+      end;
+      yyerror('Include file not found on search paths: <'+fn+'>');
+    end
+    else if (fn[1] = '"') and (fn[length(fn)] = '"') then begin
+      fn:= copy(fn, 2, Length(fn)-2);
+      f:= ConcatPaths([WorkDir, fn]);
+      if FileExists(f) then
+        Exit(f);
+      if fn = 'windows.h' then begin
+        // treat windows.h as an alias for windres.h
+        f:= ConcatPaths([WorkDir, 'windres.h']);
+        if FileExists(f) then
+          Exit(f);
+      end;
+      yyerror('Include file not found: "'+fn+'"');
+    end;
+  end;
+  yyerror('Invalid include directive: "'+fn+'"');
+end;
+
+constructor tyinclude.Create;
+begin
+  inherited Create;
+  level:= 0;
+  WorkDir:= GetCurrentDir;
+  SearchPaths:= TStringList.Create;
+end;
+
+destructor tyinclude.Destroy;
+begin
+  FreeAndNil(SearchPaths);
+  inherited;
+end;
+
+{$ENDIF}
+

+ 160 - 0
packages/fcl-res/src/yypreproc.pp

@@ -0,0 +1,160 @@
+{%MainUnit rcparser.pas}
+
+{$IFDEF INC_HEADER}
+
+type
+  typreproc = class
+  const
+    yp_maxlevels = 16;
+  var
+    Defines: TStringHashTable;
+    skip  : array[0..yp_maxlevels-1] of boolean;
+    cheadermode: boolean;
+    level : longint;
+  public
+    constructor Create;
+    destructor Destroy; override;
+    function isdefine(ident: string): boolean;
+    function getdefine(ident: string): string;
+    function useline(line: string): boolean;
+    procedure newfile(fn: string);
+  end;
+
+var
+  ypreproc: typreproc;
+
+{$ELSE}
+
+constructor typreproc.Create;
+begin
+  inherited Create;
+  Defines:= TStringHashTable.Create;
+  level:= 0;
+  cheadermode:= false;
+  fillchar(skip,sizeof(skip),0);
+end;
+
+destructor typreproc.Destroy;
+begin
+  FreeAndNil(Defines);
+  inherited;
+end;
+
+function Copy2SpaceDelTrim(var s: string): string;
+const
+  whitespace = [#9, ' '];
+var
+  p: integer;
+begin
+  p:= PosSet(whitespace, s);
+  if p <= 0 then begin
+    result:= s;
+    s:= '';
+  end else begin
+    result:= Copy(S, 1, p-1);
+    while (p < Length(s)) and (s[p] in whitespace) do
+      inc(p);
+    Delete(s, 1, p-1);
+  end;
+end;
+
+function Substring(s: string; First, Last: integer): string;
+begin
+  Result:= Copy(s, First, Last-First+1);
+end;
+
+function typreproc.isdefine(ident: string): boolean;
+begin
+  Result:= Defines.IndexOf(ident) >= 0;
+end;
+
+function typreproc.getdefine(ident: string): string;
+begin
+  Result:= Defines[ident];
+end;
+
+function typreproc.useline(line: string): boolean;
+var
+  w, word, arg1: string;
+begin
+  Result:= true;
+  w:= trim(line);
+  if (yystate <= 1) and
+     (Length(w) > 2) and (w[1] = '#') then begin
+    Delete(w, 1, 1);
+    word:= Copy2SpaceDelTrim(w);
+    case word of
+      'ifdef': begin
+        inc(Level);
+        if Level >= yp_maxlevels then begin
+          yyerror('Too many ifdef levels');
+          exit;
+        end;
+        skip[level]:= (skip[level-1] or (not isdefine(w)));
+      end;
+      'ifndef': begin
+        inc(Level);
+        if Level >= yp_maxlevels then begin
+          yyerror('Too many ifdef levels');
+          exit;
+        end;
+        skip[level]:= (skip[level-1] or (isdefine(w)));
+      end;
+      'if': begin
+        inc(Level);
+        if Level >= yp_maxlevels then begin
+          yyerror('Too many ifdef levels');
+          exit;
+        end;
+        { TODO : implement some expressions? for now, always returns false }
+        skip[level]:= (skip[level-1] or False);
+      end;
+      'else': begin
+        skip[level]:= skip[level-1] or (not skip[level]);
+      end;
+      'endif': begin
+        skip[level]:= false;
+        if Level = 0 then begin
+          yyerror('Too many endif found');
+          exit;
+        end;
+        dec(level);
+      end;
+    else
+      if not skip[level] then
+        case word of
+          'pragma': begin
+            if StartsStr('code_page(', w) then begin
+              arg1:= Substring(w, Length('code_page(') + 1, Pos(')', w) - 1);
+              PragmaCodePage(arg1);
+            end;
+          end;
+          'define': begin
+            arg1:= Copy2SpaceDelTrim(w);
+            Defines[arg1]:= w;
+          end;
+          'undef': begin
+            Defines.Remove(w);
+          end;
+          'include': begin
+            arg1:= yinclude.expand(w);
+            yinclude.push(arg1);
+          end;
+        end;
+    end;
+    Result:= false;
+  end else begin
+    Result:= (not cheadermode) and (not skip[level]);
+  end;
+end;
+
+procedure typreproc.newfile(fn: string);
+var
+  ex: String;
+begin
+  ex:= UpperCase(ExtractFileExt(yyfilename));
+  cheadermode:= (ex = '.C') or (ex = '.H');
+end;
+
+
+{$ENDIF}

+ 1 - 0
packages/fpmake_add.inc

@@ -118,6 +118,7 @@
   add_syslog(ADirectory+IncludeTrailingPathDelimiter('syslog'));
   add_tcl(ADirectory+IncludeTrailingPathDelimiter('tcl'));
   add_tosunits(ADirectory+IncludeTrailingPathDelimiter('tosunits'));
+  add_tplylib(ADirectory+IncludeTrailingPathDelimiter('tplylib'));
   add_univint(ADirectory+IncludeTrailingPathDelimiter('univint'));
   add_unixutil(ADirectory+IncludeTrailingPathDelimiter('unixutil'));
   add_unzip(ADirectory+IncludeTrailingPathDelimiter('unzip'));

+ 6 - 0
packages/fpmake_proc.inc

@@ -679,6 +679,12 @@ begin
 {$include tosunits/fpmake.pp}
 end;
 
+procedure add_tplylib(const ADirectory: string);
+begin
+  with Installer do
+{$include tplylib/fpmake.pp}
+end;
+
 procedure add_univint(const ADirectory: string);
 begin
   with Installer do

+ 2 - 3
packages/pastojs/src/pas2jslibcompiler.pp

@@ -210,10 +210,9 @@ begin
   if (UnitNameLen>0) and Assigned(OnUnitAlias) then
     begin
     UnitNameMaxLen:=Max(UnitNameLen,255);
-    s:=UseUnitName;
-    SetLength(s,UnitNameMaxLen);
+    s:=UseUnitName+StringOfChar(#0,UnitNameMaxLen-UnitNameLen);
     if OnUnitAlias(OnUnitAliasData,Pointer(s),UnitNameMaxLen) then
-      UseUnitName:=LeftStr(s,UnitNameLen);
+      UseUnitName:=PAnsiChar(s);
     end;
 end;
 

+ 2745 - 0
packages/tplylib/Makefile

@@ -0,0 +1,2745 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-win64 aarch64-android aarch64-ios wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc
+BSDs = freebsd netbsd openbsd darwin dragonfly
+UNIXs = linux $(BSDs) solaris qnx haiku aix
+LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for arm-embedded, a sub-architecture (e.g. SUBARCH=armv4t or SUBARCH=armv7m) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for avr-embedded, a sub-architecture (e.g. SUBARCH=avr25 or SUBARCH=avr35) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for mipsel-embedded, a sub-architecture (e.g. SUBARCH=pic32mx) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for xtensa-embedded, a sub-architecture (e.g. SUBARCH=lx106 or SUBARCH=lx6) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+ifeq ($(SUBARCH),)
+$(error When compiling for xtensa-freertos, a sub-architecture (e.g. SUBARCH=lx106 or SUBARCH=lx6) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifeq ($(FULL_TARGET),arm-freertos)
+ifeq ($(SUBARCH),)
+$(error When compiling for arm-freertos, a sub-architecture (e.g. SUBARCH=armv6m or SUBARCH=armv7em) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+endif
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+ifndef CROSSCOMPILE
+BUILDFULLNATIVE=1
+export BUILDFULLNATIVE
+endif
+ifdef BUILDFULLNATIVE
+BUILDNATIVE=1
+export BUILDNATIVE
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim ios),)
+ifneq ($(findstring $(OS_SOURCE),darwin ios),)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifneq ($(OS_TARGET),msdos)
+ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+ifeq ($(OS_TARGET),android)
+ifeq ($(CPU_TARGET),arm)
+BINUTILSPREFIX=arm-linux-androideabi-
+else
+ifeq ($(CPU_TARGET),i386)
+BINUTILSPREFIX=i686-linux-android-
+else
+BINUTILSPREFIX=$(CPU_TARGET)-linux-android-
+endif
+endif
+endif
+endif
+endif
+else
+BINUTILSPREFIX=$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages)
+ifndef FPCFPMAKE
+ifdef CROSSCOMPILE
+ifeq ($(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR)))),)
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPCFPMAKE:=$(shell $(FPCPROG) -PB)
+ifeq ($(strip $(wildcard $(FPCFPMAKE))),)
+FPCFPMAKE:=$(firstword $(FPCPROG))
+endif
+else
+override FPCFPMAKE=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+FPCFPMAKE=$(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR))))
+FPMAKE_SKIP_CONFIG=-n
+export FPCFPMAKE
+export FPMAKE_SKIP_CONFIG
+endif
+else
+FPMAKE_SKIP_CONFIG=-n
+FPCFPMAKE=$(FPC)
+endif
+endif
+override PACKAGE_NAME=tplylib
+override PACKAGE_VERSION=3.3.1
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
+endif
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
+endif
+LOCALFPMAKE=./fpmake$(SRCEXEEXT)
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+else
+CROSSGCCOPT=-m32
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+else
+CROSSGCCOPT=-m32
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+else
+CROSSGCCOPT=-m64
+endif
+endif
+ifeq ($(CPU_TARGET),sparc)
+ifneq ($(findstring sparc64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+else
+CROSSGCCOPT=-m32
+endif
+endif
+endif
+endif
+ifdef FPCFPMAKE
+FPCFPMAKE_CPU_TARGET=$(shell $(FPCFPMAKE) -iTP)
+ifeq ($(CPU_TARGET),$(FPCFPMAKE_CPU_TARGET))
+FPCMAKEGCCLIBDIR:=$(GCCLIBDIR)
+endif
+endif
+ifndef FPCMAKEGCCLIBDIR
+FPCMAKEGCCLIBDIR:=$(shell dirname `gcc -print-libgcc-file-name`)
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) $(CROSSGCCOPT) -print-libgcc-file-name`)
+endif
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR:=/usr/pkg/lib
+endif
+export GCCLIBDIR FPCMAKEGCCLIBDIR OTHERLIBDIR
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+LTOEXT=.bc
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+EXEDBGEXT=.dbg
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifneq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),dragonfly)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=df
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),aros)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=aros
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macosclassic)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim ios),)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+EXEDBGEXT=.dSYM
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
+ifeq ($(OS_TARGET),aix)
+BATCHEXT=.sh
+EXEEXT=
+SHAREDLIBEXT=.a
+SHORTSUFFIX=aix
+endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
+endif
+ifeq ($(OS_TARGET),msdos)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHORTSUFFIX=d16
+endif
+ifeq ($(OS_TARGET),msxdos)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHORTSUFFIX=msd
+endif
+ifeq ($(OS_TARGET),embedded)
+ifeq ($(CPU_TARGET),i8086)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+else
+EXEEXT=.bin
+endif
+ifeq ($(CPU_TARGET),z80)
+OEXT=.rel
+endif
+SHORTSUFFIX=emb
+endif
+ifeq ($(OS_TARGET),win16)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w16
+endif
+ifeq ($(OS_TARGET),zxspectrum)
+OEXT=.rel
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+NASMNAME=$(BINUTILSPREFIX)nasm
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+ifndef NASMPROG
+ifdef CROSSBINDIR
+NASMPROG=$(CROSSBINDIR)/$(NASMNAME)$(SRCEXEEXT)
+else
+NASMPROG=$(NASMNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+NASM=$(NASMPROG)
+ifdef inUnix
+PPAS=./ppas$(SRCBATCHEXT)
+else
+PPAS=ppas$(SRCBATCHEXT)
+endif
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl fpmkunit
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i386-aros)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-macosclassic)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macosclassic)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-haiku)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-aros)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),x86_64-dragonfly)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-aros)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-freertos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),arm-ios)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),mipsel-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),mips64el-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i8086-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),i8086-win16)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),aarch64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),aarch64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),aarch64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),aarch64-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),aarch64-ios)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),wasm-wasm)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),sparc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),riscv32-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),riscv32-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),riscv64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),riscv64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),xtensa-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),xtensa-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),xtensa-freertos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),z80-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),z80-zxspectrum)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),z80-msxdos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifeq ($(FULL_TARGET),z80-amstradcpc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+ifdef UNITDIR_FPMAKE_RTL
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
+else
+UNITDIR_PASZLIB=
+endif
+endif
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
+endif
+ifdef UNITDIR_FPMAKE_PASZLIB
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_PASZLIB)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL-PROCESS
+PACKAGEDIR_FCL-PROCESS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-process/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-PROCESS),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-PROCESS)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-PROCESS) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-PROCESS)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-PROCESS=
+UNITDIR_FCL-PROCESS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-process/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-PROCESS),)
+UNITDIR_FCL-PROCESS:=$(firstword $(UNITDIR_FCL-PROCESS))
+else
+UNITDIR_FCL-PROCESS=
+endif
+endif
+ifdef UNITDIR_FCL-PROCESS
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-PROCESS)
+endif
+ifdef UNITDIR_FPMAKE_FCL-PROCESS
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FCL-PROCESS)
+endif
+endif
+ifdef REQUIRE_PACKAGES_HASH
+PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_HASH),)
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
+else
+UNITDIR_HASH=$(PACKAGEDIR_HASH)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_HASH)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_HASH=
+UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_HASH),)
+UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
+else
+UNITDIR_HASH=
+endif
+endif
+ifdef UNITDIR_HASH
+override COMPILER_UNITDIR+=$(UNITDIR_HASH)
+endif
+ifdef UNITDIR_FPMAKE_HASH
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_HASH)
+endif
+endif
+ifdef REQUIRE_PACKAGES_LIBTAR
+PACKAGEDIR_LIBTAR:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /libtar/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_LIBTAR),)
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units/$(TARGETSUFFIX)),)
+UNITDIR_LIBTAR=$(PACKAGEDIR_LIBTAR)/units/$(TARGETSUFFIX)
+else
+UNITDIR_LIBTAR=$(PACKAGEDIR_LIBTAR)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_LIBTAR)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_LIBTAR) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_LIBTAR)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_LIBTAR=
+UNITDIR_LIBTAR:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /libtar/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_LIBTAR),)
+UNITDIR_LIBTAR:=$(firstword $(UNITDIR_LIBTAR))
+else
+UNITDIR_LIBTAR=
+endif
+endif
+ifdef UNITDIR_LIBTAR
+override COMPILER_UNITDIR+=$(UNITDIR_LIBTAR)
+endif
+ifdef UNITDIR_FPMAKE_LIBTAR
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_LIBTAR)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FPMKUNIT
+PACKAGEDIR_FPMKUNIT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FPMKUNIT),)
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)),)
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FPMKUNIT) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FPMKUNIT=
+UNITDIR_FPMKUNIT:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FPMKUNIT),)
+UNITDIR_FPMKUNIT:=$(firstword $(UNITDIR_FPMKUNIT))
+else
+UNITDIR_FPMKUNIT=
+endif
+endif
+ifdef UNITDIR_FPMKUNIT
+override COMPILER_UNITDIR+=$(UNITDIR_FPMKUNIT)
+endif
+ifdef UNITDIR_FPMAKE_FPMKUNIT
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FPMKUNIT)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+override FPCMAKEOPT+=-FD$(NEW_BINUTILS_PATH)
+override FPMAKE_BUILD_OPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifndef CROSSCOMPILE
+ifneq ($(BINUTILSPREFIX),)
+override FPCMAKEOPT+=-XP$(BINUTILSPREFIX)
+override FPMAKE_BUILD_OPT+=-XP$(BINUTILSPREFIX)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+FPCCPUOPT:=-O2
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+endif
+ifneq ($(findstring $(OS_TARGET),dragonfly freebsd openbsd netbsd linux solaris),)
+ifneq ($(findstring $(CPU_TARGET),x86_64 mips mipsel),)
+override FPCOPT+=-Cg
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+ifdef FPCMAKEGCCLIBDIR
+override FPCMAKEOPT+=-Fl$(FPCMAKEGCCLIBDIR)
+else
+override FPCMAKEOPT+=-Fl$(GCCLIBDIR)
+endif
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPMAKEBUILDOPT
+override FPMAKE_BUILD_OPT+=$(FPMAKEBUILDOPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(strip $(FPC) $(FPCOPT))
+ifneq (,$(findstring -sh ,$(COMPILER)))
+UseEXECPPAS=1
+endif
+ifneq (,$(findstring -s ,$(COMPILER)))
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+UseEXECPPAS=1
+endif
+endif
+ifneq ($(UseEXECPPAS),1)
+EXECPPAS=
+else
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+ifneq ($(IMPORTLIBPREFIX)-$(STATICLIBEXT),$(STATICLIBPREFIX)-$(STATICLIBEXT))
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+else
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+endif
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILENAMES:=$(notdir $(INSTALLPPUFILES))
+override INSTALLPPULINKFILENAMES:=$(notdir $(INSTALLPPULINKFILES))
+override INSTALLPPUFILES=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILENAMES))
+override INSTALLPPULINKFILES=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILENAMES)))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(EXAMPLEINSTALLTARGET) $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+override CLEANEXEDBGFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEDBGFILES))
+endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+override CLEANEXEDBGFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEDBGEXT), $(CLEAN_PROGRAMS)))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(subst $(PPUEXT),$(LTOEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILENAMES:=$(CLEANPPUFILES)
+override CLEANPPUFILES=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILENAMES))
+override CLEANPPULINKFILENAMES:=$(CLEANPPULINKFILES)
+override CLEANPPULINKFILES=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILENAMES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANEXEDBGFILES
+	-$(DELTREE) $(CLEANEXEDBGFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) *$(FULL_TARGET).fpm Package.fpc *$(ASMEXT)
+	-$(DEL) $(FPCEXTFILE) $(REDIRFILE) script*.res link*.res *_script.res *_link.res
+	-$(DEL) $(PPAS) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+	-$(DELTREE) units
+	-$(DELTREE) bin
+	-$(DEL) *$(OEXT) *$(LTOEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc *.fpm
+	-$(DEL) $(FPCEXTFILE) $(REDIRFILE) script*.res link*.res *_script.res *_link.res
+	-$(DEL) $(PPAS) *_ppas$(BATCHEXT) ppas$(BATCHEXT) ppaslink$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+ifdef LOCALFPMAKEBIN
+	-$(DEL) $(LOCALFPMAKEBIN)
+	-$(DEL) $(FPMAKEBINOBJ)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)  FPC fpmake... $(FPCFPMAKE)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+units:
+examples:
+shared:
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+zipexampleinstall: fpc_zipexampleinstall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: units examples shared sourceinstall exampleinstall zipexampleinstall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+override FPCOPT:=$(filter-out -FU%,$(FPCOPT))
+override FPCOPT:=$(filter-out -FE%,$(FPCOPT))
+override FPCOPT:=$(filter-out $(addprefix -Fu,$(COMPILER_UNITDIR)),$(FPCOPT))# Compose general fpmake-parameters
+ifdef FPMAKEOPT
+FPMAKE_OPT+=$(FPMAKEOPT)
+endif
+FPMAKE_OPT+=--localunitdir=../..
+FPMAKE_OPT+=--globalunitdir=..
+FPMAKE_OPT+=$(FPC_TARGETOPT)
+FPMAKE_OPT+=$(addprefix -o ,$(FPCOPT))
+FPMAKE_OPT+=--compiler=$(FPC)
+FPMAKE_OPT+=-bu
+.NOTPARALLEL:
+fpmake$(SRCEXEEXT): fpmake.pp
+	$(FPCFPMAKE) fpmake.pp $(FPMAKE_SKIP_CONFIG) $(addprefix -Fu,$(COMPILER_FPMAKE_UNITDIR)) $(FPCMAKEOPT) $(OPT)
+all:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT)
+smart:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -XX -o -CX
+release:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dRELEASE
+debug:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dDEBUG
+ifeq ($(FPMAKE_BIN_CLEAN),)
+clean:
+else
+clean:
+	$(FPMAKE_BIN_CLEAN) clean $(FPMAKE_OPT)
+endif
+ifeq ($(FPMAKE_BIN_CLEAN),)
+distclean:	$(addsuffix _distclean,$(TARGET_DIRS)) fpc_cleanall
+else
+distclean:
+ifdef inUnix
+	{ $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT); if [ $$? != "0" ]; then { echo Something wrong with fpmake exectable. Remove the executable and call make recursively to recover.; $(DEL) $(FPMAKE_BIN_CLEAN); $(MAKE) fpc_cleanall; }; fi;  }
+else
+	$(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT)
+endif
+	-$(DEL) $(LOCALFPMAKE)
+endif
+cleanall: distclean
+install:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR)
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --baseinstalldir=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR)
+endif
+distinstall:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR) -ie -fsp 0
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --baseinstalldir=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR) -ie -fsp 0
+endif
+zipinstall:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) zipinstall $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX)
+zipdistinstall:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) zipinstall $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) -ie -fsp 0
+zipsourceinstall:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) archive $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) --prefix=share/src/fpc-\$$\(PACKAGEVERSION\)/$(INSTALL_FPCSUBDIR)/\$$\(PACKAGEDIRECTORY\)
+else
+	$(LOCALFPMAKE) archive $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) --prefix=source\\$(INSTALL_FPCSUBDIR)\\\$$\(PACKAGEDIRECTORY\)
+endif

+ 102 - 0
packages/tplylib/Makefile.fpc

@@ -0,0 +1,102 @@
+#
+#   Makefile.fpc for running fpmake
+#
+
+[package]
+name=tplylib
+version=3.3.1
+
+[require]
+packages=rtl fpmkunit
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[prerules]
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
+endif
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
+endif
+LOCALFPMAKE=./fpmake$(SRCEXEEXT)
+
+[rules]
+# Do not pass the Makefile's unit and binary target locations. Fpmake uses it's own.
+override FPCOPT:=$(filter-out -FU%,$(FPCOPT))
+override FPCOPT:=$(filter-out -FE%,$(FPCOPT))
+# Do not pass the package-unitdirectories. Fpmake adds those and this way they don't apear in the .fpm
+override FPCOPT:=$(filter-out $(addprefix -Fu,$(COMPILER_UNITDIR)),$(FPCOPT))# Compose general fpmake-parameters
+# Compose general fpmake-parameters
+ifdef FPMAKEOPT
+FPMAKE_OPT+=$(FPMAKEOPT)
+endif
+FPMAKE_OPT+=--localunitdir=../..
+FPMAKE_OPT+=--globalunitdir=..
+FPMAKE_OPT+=$(FPC_TARGETOPT)
+FPMAKE_OPT+=$(addprefix -o ,$(FPCOPT))
+FPMAKE_OPT+=--compiler=$(FPC)
+FPMAKE_OPT+=-bu
+.NOTPARALLEL:
+
+fpmake$(SRCEXEEXT): fpmake.pp
+	$(FPCFPMAKE) fpmake.pp $(FPMAKE_SKIP_CONFIG) $(addprefix -Fu,$(COMPILER_FPMAKE_UNITDIR)) $(FPCMAKEOPT) $(OPT)
+all:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT)
+smart:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -XX -o -CX
+release:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dRELEASE
+debug:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dDEBUG
+# If no fpmake exists and (dist)clean is called, do not try to build fpmake, it will
+# most often fail because the dependencies are cleared.
+# In case of a clean, simply do nothing
+ifeq ($(FPMAKE_BIN_CLEAN),)
+clean:
+else
+clean:
+	$(FPMAKE_BIN_CLEAN) clean $(FPMAKE_OPT)
+endif
+# In case of a distclean, perform an 'old'-style distclean. This to avoid problems
+# when the package is compiled using fpcmake prior to running this clean using fpmake
+ifeq ($(FPMAKE_BIN_CLEAN),)
+distclean:	$(addsuffix _distclean,$(TARGET_DIRS)) fpc_cleanall
+else
+distclean:
+ifdef inUnix
+        { $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT); if [ $$? != "0" ]; then { echo Something wrong with fpmake exectable. Remove the executable and call make recursively to recover.; $(DEL) $(FPMAKE_BIN_CLEAN); $(MAKE) fpc_cleanall; }; fi;  }
+else
+        $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT)
+endif
+	-$(DEL) $(LOCALFPMAKE)
+endif
+cleanall: distclean
+install:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR)
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --baseinstalldir=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR)
+endif
+# distinstall also installs the example-sources and omits the location of the source-
+# files from the fpunits.cfg files.
+distinstall:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR) -ie -fsp 0
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --baseinstalldir=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR) -ie -fsp 0
+endif
+zipinstall:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) zipinstall $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX)
+zipdistinstall:	fpmake$(SRCEXEEXT)
+	$(LOCALFPMAKE) zipinstall $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) -ie -fsp 0
+zipsourceinstall:	fpmake$(SRCEXEEXT)
+ifdef UNIXHier
+	$(LOCALFPMAKE) archive $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) --prefix=share/src/fpc-\$$\(PACKAGEVERSION\)/$(INSTALL_FPCSUBDIR)/\$$\(PACKAGEDIRECTORY\)
+else
+	$(LOCALFPMAKE) archive $(FPMAKE_OPT) --zipprefix=$(DIST_DESTDIR)/$(ZIPPREFIX) --prefix=source\\$(INSTALL_FPCSUBDIR)\\\$$\(PACKAGEDIRECTORY\)
+endif

+ 54 - 0
packages/tplylib/fpmake.pp

@@ -0,0 +1,54 @@
+{$ifndef ALLPACKAGES}
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+Var
+  T : TTarget;
+  P : TPackage;
+begin
+  With Installer do
+    begin
+{$endif ALLPACKAGES}
+
+    P:=AddPackage('tplylib');
+    P.ShortName:='tplylib';
+{$ifdef ALLPACKAGES}
+    P.Directory:=ADirectory;
+{$endif ALLPACKAGES}
+    P.Version:='3.3.1';
+
+    { java and jvm-android do not support
+      fpc_get_output used in these sources }
+    if Defaults.CPU=jvm then
+      P.OSes := P.OSes - [java,android];
+    { palmos does not support command line parameters }
+    P.OSes := P.OSes - [palmos];
+    { Program does not fit in 16-bit memory constraints }
+    P.OSes := P.OSes - [msdos,win16];
+    { avr-embedded and i8086-embedded do not meet needed requirements }
+    if Defaults.CPU in [avr,i8086] then
+      P.OSes := P.OSes - [embedded];
+
+    P.Author := '<various>';
+    P.License := 'LGPL with modification';
+    P.HomepageURL := 'www.freepascal.org';
+    P.Email := '';
+    P.Description := 'Library units for a compiler generator for Turbo Pascal and compatibles.';
+    P.NeedLibC:= false;
+
+    P.SourcePath.Add('src');
+    P.IncludePath.Add('src');
+
+    P.Options.Add('-Sg');
+
+    P.Targets.AddUnit('lexlib.pas');
+    P.Targets.AddUnit('yacclib.pas');
+
+{$ifndef ALLPACKAGES}
+    Run;
+    end;
+end.
+{$endif ALLPACKAGES}
+

+ 14 - 11
utils/tply/lexlib.pas → packages/tplylib/src/lexlib.pas

@@ -70,15 +70,15 @@ yyleng            : Byte         (* length of matched text *)
    put_char by another suitable set of routines, e.g. if you want to read
    from/write to memory, etc. *)
 
-function get_char : Char;
+var get_char: function  : Char;
   (* obtain one character from the input file (null character at end-of-
      file) *)
 
-procedure unget_char ( c : Char );
+var unget_char : procedure ( c : Char );
   (* return one character to the input file to be reread in subsequent calls
      to get_char *)
 
-procedure put_char ( c : Char );
+var put_char: procedure ( c : Char );
   (* write one character to the output file *)
 
 (* Utility routines: *)
@@ -185,7 +185,7 @@ var
 bufptr : Integer;
 buf    : array [1..max_chars] of Char;
 
-function get_char : Char;
+function lexlib_get_char : Char;
   var i : Integer;
   begin
     if (bufptr=0) and not eof(yyinput) then
@@ -199,15 +199,15 @@ function get_char : Char;
       end;
     if bufptr>0 then
       begin
-        get_char := buf[bufptr];
+        lexlib_get_char := buf[bufptr];
         dec(bufptr);
         inc(yycolno);
       end
     else
-      get_char := #0;
+      lexlib_get_char := #0;
   end(*get_char*);
 
-procedure unget_char ( c : Char );
+procedure lexlib_unget_char ( c : Char );
   begin
     if bufptr=max_chars then fatal('input buffer overflow');
     inc(bufptr);
@@ -215,7 +215,7 @@ procedure unget_char ( c : Char );
     buf[bufptr] := c;
   end(*unget_char*);
 
-procedure put_char ( c : Char );
+procedure lexlib_put_char ( c : Char );
   begin
     if c=#0 then
       { ignore }
@@ -285,7 +285,7 @@ procedure reject;
   begin
     yyreject := true;
     for i := yyleng+1 to yysleng do
-      yytext := yytext+get_char;
+      yytext := yytext+get_char();
     dec(yymatches);
   end(*reject*);
 
@@ -334,7 +334,7 @@ procedure yynew;
 procedure yyscan;
   begin
     if yyleng=255 then fatal('yytext overflow');
-    yyactchar := get_char;
+    yyactchar := get_char();
     inc(yyleng);
     yytext[yyleng] := yyactchar;
   end(*yyscan*);
@@ -380,7 +380,7 @@ function yyfind ( var n : Integer ) : Boolean;
 function yydefault : Boolean;
   begin
     yyreject := false;
-    yyactchar := get_char;
+    yyactchar := get_char();
     if yyactchar<>#0 then
       begin
         put_char(yyactchar);
@@ -406,6 +406,9 @@ procedure yyclear;
 
 begin
   yywrap := @lexlib_yywrap;
+  get_char:= @lexlib_get_char;
+  unget_char:= @lexlib_unget_char;
+  put_char:= @lexlib_put_char;
   assign(yyinput, '');
   assign(yyoutput, '');
   reset(yyinput); rewrite(yyoutput);

+ 0 - 0
utils/tply/yacclib.pas → packages/tplylib/src/yacclib.pas


+ 173 - 0
tests/webtbs/tw37554.pp

@@ -0,0 +1,173 @@
+program tw37554;
+
+{$mode objfpc}{$H+}
+
+const
+  CmpArray: array[0..88] of Int64 = (
+    -1, $FFFFFFFF, -3000000, -2147483648, -131073,
+
+    $FFFFFFFFFFFF0000, $FFFFFFFF0000FFFF, $FFFF0000FFFFFFFF, $0000FFFFFFFFFFFF,
+
+    $FFFFFFFFFFFFFFFE, $FFFFFFFFFFFFFFFD, $FFFFFFFFFFFFFFFB, $FFFFFFFFFFFFFFF7,
+    $FFFFFFFFFFFFFFEF, $FFFFFFFFFFFFFFDF, $FFFFFFFFFFFFFFBF, $FFFFFFFFFFFFFF7F,
+    $FFFFFFFFFFFFFEFF, $FFFFFFFFFFFFFDFF, $FFFFFFFFFFFFFBFF, $FFFFFFFFFFFFF7FF,
+    $FFFFFFFFFFFFEFFF, $FFFFFFFFFFFFDFFF, $FFFFFFFFFFFFBFFF, $FFFFFFFFFFFF7FFF,
+    $FFFFFFFFFFFEFFFF, $FFFFFFFFFFFDFFFF, $FFFFFFFFFFFBFFFF, $FFFFFFFFFFF7FFFF,
+    $FFFFFFFFFFEFFFFF, $FFFFFFFFFFDFFFFF, $FFFFFFFFFFBFFFFF, $FFFFFFFFFF7FFFFF,
+    $FFFFFFFFFEFFFFFF, $FFFFFFFFFDFFFFFF, $FFFFFFFFFBFFFFFF, $FFFFFFFFF7FFFFFF,
+    $FFFFFFFFEFFFFFFF, $FFFFFFFFDFFFFFFF, $FFFFFFFFBFFFFFFF, $FFFFFFFF7FFFFFFF,
+    $FFFFFFFEFFFFFFFF, $FFFFFFFDFFFFFFFF, $FFFFFFFBFFFFFFFF, $FFFFFFF7FFFFFFFF,
+    $FFFFFFEFFFFFFFFF, $FFFFFFDFFFFFFFFF, $FFFFFFBFFFFFFFFF, $FFFFFF7FFFFFFFFF,
+    $FFFFFEFFFFFFFFFF, $FFFFFDFFFFFFFFFF, $FFFFFBFFFFFFFFFF, $FFFFF7FFFFFFFFFF,
+    $FFFFEFFFFFFFFFFF, $FFFFDFFFFFFFFFFF, $FFFFBFFFFFFFFFFF, $FFFF7FFFFFFFFFFF,
+    $FFFEFFFFFFFFFFFF, $FFFDFFFFFFFFFFFF, $FFFBFFFFFFFFFFFF, $FFF7FFFFFFFFFFFF,
+    $FFEFFFFFFFFFFFFF, $FFDFFFFFFFFFFFFF, $FFBFFFFFFFFFFFFF, $FF7FFFFFFFFFFFFF,
+    $FEFFFFFFFFFFFFFF, $FDFFFFFFFFFFFFFF, $FBFFFFFFFFFFFFFF, $F7FFFFFFFFFFFFFF,
+    $EFFFFFFFFFFFFFFF, $DFFFFFFFFFFFFFFF, $BFFFFFFFFFFFFFFF, $7FFFFFFFFFFFFFFF,
+
+    $FFFFFFFFFFFF1234, $FFFFFFFF1234FFFF, $FFFF1234FFFFFFFF, $1234FFFFFFFFFFFF,
+    $FFFFFFFF12341234, $FFFF1234FFFF1234, $FFFF12341234FFFF, $FFFF123412341234,
+    $FFFFFFFFFFFF0001, $FFFFFFFF0001FFFF, $FFFF0001FFFFFFFF, $0001FFFFFFFFFFFF,
+
+    $0000000100000001, $0000000500000005, $0000AAAA0000AAAA, $0000FFFF0000FFFF
+  );
+
+var
+  Fail: Boolean;
+
+procedure CompareImmediate(CmpIndex: Integer; TestVal: Int64);
+begin
+  Write('Test ', CmpIndex, '; input constant: ', TestVal, '; comparing against: ', CmpArray[CmpIndex], ' - ');
+  if TestVal = CmpArray[CmpIndex] then
+    begin
+      WriteLn('Pass');
+      Exit;
+    end;
+
+  WriteLn('FAIL - expected ', CmpArray[CmpIndex]);
+  Fail := True;
+end;
+
+begin
+  Fail := False;
+
+  CompareImmediate(0, -1);
+  CompareImmediate(1, $FFFFFFFF);
+  CompareImmediate(2, -3000000);
+  CompareImmediate(3, -2147483648);
+  CompareImmediate(4, -131073);
+
+  CompareImmediate(5, $FFFFFFFFFFFF0000);
+  CompareImmediate(6, $FFFFFFFF0000FFFF);
+  CompareImmediate(7, $FFFF0000FFFFFFFF);
+  CompareImmediate(8, $0000FFFFFFFFFFFF);
+
+  CompareImmediate(9, $FFFFFFFFFFFFFFFE);
+  CompareImmediate(10, $FFFFFFFFFFFFFFFD);
+  CompareImmediate(11, $FFFFFFFFFFFFFFFB);
+  CompareImmediate(12, $FFFFFFFFFFFFFFF7);
+
+  CompareImmediate(13, $FFFFFFFFFFFFFFEF);
+  CompareImmediate(14, $FFFFFFFFFFFFFFDF);
+  CompareImmediate(15, $FFFFFFFFFFFFFFBF);
+  CompareImmediate(16, $FFFFFFFFFFFFFF7F);
+
+  CompareImmediate(17, $FFFFFFFFFFFFFEFF);
+  CompareImmediate(18, $FFFFFFFFFFFFFDFF);
+  CompareImmediate(19, $FFFFFFFFFFFFFBFF);
+  CompareImmediate(20, $FFFFFFFFFFFFF7FF);
+
+  CompareImmediate(21, $FFFFFFFFFFFFEFFF);
+  CompareImmediate(22, $FFFFFFFFFFFFDFFF);
+  CompareImmediate(23, $FFFFFFFFFFFFBFFF);
+  CompareImmediate(24, $FFFFFFFFFFFF7FFF);
+
+  CompareImmediate(25, $FFFFFFFFFFFEFFFF);
+  CompareImmediate(26, $FFFFFFFFFFFDFFFF);
+  CompareImmediate(27, $FFFFFFFFFFFBFFFF);
+  CompareImmediate(28, $FFFFFFFFFFF7FFFF);
+
+  CompareImmediate(29, $FFFFFFFFFFEFFFFF);
+  CompareImmediate(30, $FFFFFFFFFFDFFFFF);
+  CompareImmediate(31, $FFFFFFFFFFBFFFFF);
+  CompareImmediate(32, $FFFFFFFFFF7FFFFF);
+
+  CompareImmediate(33, $FFFFFFFFFEFFFFFF);
+  CompareImmediate(34, $FFFFFFFFFDFFFFFF);
+  CompareImmediate(35, $FFFFFFFFFBFFFFFF);
+  CompareImmediate(36, $FFFFFFFFF7FFFFFF);
+
+  CompareImmediate(37, $FFFFFFFFEFFFFFFF);
+  CompareImmediate(38, $FFFFFFFFDFFFFFFF);
+  CompareImmediate(39, $FFFFFFFFBFFFFFFF);
+  CompareImmediate(40, $FFFFFFFF7FFFFFFF);
+
+  CompareImmediate(41, $FFFFFFFEFFFFFFFF);
+  CompareImmediate(42, $FFFFFFFDFFFFFFFF);
+  CompareImmediate(43, $FFFFFFFBFFFFFFFF);
+  CompareImmediate(44, $FFFFFFF7FFFFFFFF);
+
+  CompareImmediate(45, $FFFFFFEFFFFFFFFF);
+  CompareImmediate(46, $FFFFFFDFFFFFFFFF);
+  CompareImmediate(47, $FFFFFFBFFFFFFFFF);
+  CompareImmediate(48, $FFFFFF7FFFFFFFFF);
+
+  CompareImmediate(49, $FFFFFEFFFFFFFFFF);
+  CompareImmediate(50, $FFFFFDFFFFFFFFFF);
+  CompareImmediate(51, $FFFFFBFFFFFFFFFF);
+  CompareImmediate(52, $FFFFF7FFFFFFFFFF);
+
+  CompareImmediate(53, $FFFFEFFFFFFFFFFF);
+  CompareImmediate(54, $FFFFDFFFFFFFFFFF);
+  CompareImmediate(55, $FFFFBFFFFFFFFFFF);
+  CompareImmediate(56, $FFFF7FFFFFFFFFFF);
+
+  CompareImmediate(57, $FFFEFFFFFFFFFFFF);
+  CompareImmediate(58, $FFFDFFFFFFFFFFFF);
+  CompareImmediate(59, $FFFBFFFFFFFFFFFF);
+  CompareImmediate(60, $FFF7FFFFFFFFFFFF);
+
+  CompareImmediate(61, $FFEFFFFFFFFFFFFF);
+  CompareImmediate(62, $FFDFFFFFFFFFFFFF);
+  CompareImmediate(63, $FFBFFFFFFFFFFFFF);
+  CompareImmediate(64, $FF7FFFFFFFFFFFFF);
+
+  CompareImmediate(65, $FEFFFFFFFFFFFFFF);
+  CompareImmediate(66, $FDFFFFFFFFFFFFFF);
+  CompareImmediate(67, $FBFFFFFFFFFFFFFF);
+  CompareImmediate(68, $F7FFFFFFFFFFFFFF);
+
+  CompareImmediate(69, $EFFFFFFFFFFFFFFF);
+  CompareImmediate(70, $DFFFFFFFFFFFFFFF);
+  CompareImmediate(71, $BFFFFFFFFFFFFFFF);
+  CompareImmediate(72, $7FFFFFFFFFFFFFFF);
+
+  CompareImmediate(73, $FFFFFFFFFFFF1234);
+  CompareImmediate(74, $FFFFFFFF1234FFFF);
+  CompareImmediate(75, $FFFF1234FFFFFFFF);
+  CompareImmediate(76, $1234FFFFFFFFFFFF);
+
+  CompareImmediate(77, $FFFFFFFF12341234);
+  CompareImmediate(78, $FFFF1234FFFF1234);
+  CompareImmediate(79, $FFFF12341234FFFF);
+  CompareImmediate(80, $FFFF123412341234);
+
+  CompareImmediate(81, $FFFFFFFFFFFF0001);
+  CompareImmediate(82, $FFFFFFFF0001FFFF);
+  CompareImmediate(83, $FFFF0001FFFFFFFF);
+  CompareImmediate(84, $0001FFFFFFFFFFFF);
+
+  CompareImmediate(85, $0000000100000001);
+  CompareImmediate(86, $0000000500000005);
+  CompareImmediate(87, $0000AAAA0000AAAA);
+  CompareImmediate(88, $0000FFFF0000FFFF);
+
+  { Spacing }
+  WriteLn('');
+
+  if Fail then
+    Halt(1)
+  else
+    WriteLn('ok');
+end.
+

+ 9 - 3
utils/fpcres/fpcres.pas

@@ -23,12 +23,11 @@ uses
   closablefilestream, resource,
 //readers
   resreader, coffreader, winpeimagereader, elfreader, machoreader,
-  externalreader, dfmreader, tlbreader,
+  externalreader, dfmreader, tlbreader, rcreader,
 //writers
   reswriter, coffwriter, xcoffwriter, elfwriter, machowriter, externalwriter,
 //misc
-  elfconsts, cofftypes, machotypes, externaltypes
-  ;
+  elfconsts, cofftypes, machotypes, externaltypes;
   
 const
   halt_no_err = 0;
@@ -66,6 +65,10 @@ begin
   writeln('  --version, -V        Show program version.');
   writeln('  --verbose, -v        Be verbose.');
   writeln('  --input, -i <x>      Ignored for compatibility.');
+  writeln('  --include, -I <x>    RC files: add a path for include searches');
+  writeln('  --define, -D <sym>[=<val>]');
+  writeln('                       RC files: define a symbol (and value)');
+  writeln('  --undefine, -U <sym> RC files: undefine a symbol');
   writeln('  --output, -o <x>     Set the output file name.');
   writeln('  -of <format>         Set the output file format. Supported formats:');
   writeln('                         res, elf, coff, mach-o, external');
@@ -213,6 +216,9 @@ begin
   resources:=TResources.Create;
   sourcefiles:=TSourceFiles.Create;
   sourcefiles.FileList.AddStrings(params.InputFiles);
+  sourcefiles.RCDefines.AddStrings(params.RCDefines);
+  sourcefiles.RCIncludeDirs.AddStrings(params.RCIncludeDirs);
+  sourcefiles.RCMode:=CurrentTarget.objformat=ofRes;
   try
     sourcefiles.Load(resources);
   except

+ 54 - 0
utils/fpcres/paramparser.pas

@@ -45,8 +45,12 @@ type
     fInputFiles : TStringList;
     fOutputFile : string;
     fTarget : TResTarget;
+    fRCIncludeDirs: TStringList;
+    fRCDefines: TStringList;
 
     procedure ParseInputFiles(aList : TStringList; var index : integer; const parname : string);
+    procedure ParseRCInclude(aList: TStringList; var index: integer; const parname: string);
+    procedure ParseRCUnDefine(aList: TStringList; var index: integer; const parname: string);
     procedure ParseOutputFile(aList : TStringList; var index : integer; const parname : string);
     procedure ParseOutputFormat(aList : TStringList; var index : integer; const parname : string);virtual;
     procedure ParseArchitecture(aList : TStringList; var index : integer; const parname : string);virtual;
@@ -65,6 +69,8 @@ type
     property Version : boolean read fVersion;
     property Verbose : boolean read fVerbose;
     property InputFiles : TStringList read fInputFiles;
+    property RCIncludeDirs: TStringList read fRCIncludeDirs;
+    property RCDefines: TStringList read fRCDefines;
     property OutputFile : string read fOutputFile write fOutputFile;
     property Target : TResTarget read fTarget;
   end;
@@ -195,6 +201,42 @@ begin
   end;
 end;
 
+procedure TParameters.ParseRCInclude(aList: TStringList; var index: integer;
+  const parname : string);
+var
+  tmp: String;
+begin
+  inc(index);
+  tmp:=DoMandatoryArgument(aList,index);
+  if tmp='' then
+    raise EArgumentMissingException.Create(parname);
+  fRCIncludeDirs.Add(tmp);
+end;
+
+procedure TParameters.ParseRCUnDefine(aList: TStringList; var index: integer;
+  const parname : string);
+var
+  tmp: String;
+  i: integer;
+begin
+  inc(index);
+  tmp:=DoMandatoryArgument(aList,index);
+  if tmp='' then
+    raise EArgumentMissingException.Create(parname);
+  if (parname='-D') or (parname='--define') then begin
+    i:= pos('=', tmp);
+    if i<1 then
+      fRCDefines.Values[tmp]:= ''
+    else
+      fRCDefines.Values[Copy(tmp, 1, i-1)]:= Copy(tmp, i+1);
+  end else begin
+    i:= fRCDefines.IndexOfName(tmp);
+    if i >= 0 then
+      fRCDefines.Delete(i);
+  end;
+  fRCIncludeDirs.Add(tmp);
+end;
+
 procedure TParameters.ParseOutputFile(aList: TStringList; var index: integer;
   const parname : string);
 begin
@@ -361,6 +403,11 @@ begin
           fVerbose:=true
         else if ((tmp='-i') or (tmp='--input')) then
           ParseInputFiles(fList,i,tmp)
+        else if ((tmp='-I') or (tmp='--include')) then
+          ParseRCInclude(fList,i,tmp)
+        else if ((tmp='-D') or (tmp='--define'))
+             or ((tmp='-U') or (tmp='--undefine')) then
+          ParseRCUnDefine(fList,i,tmp)
         else if ((tmp='-o') or (tmp='--output')) then
           ParseOutputFile(fList,i,tmp)
         else if (tmp='-of') then
@@ -386,10 +433,14 @@ end;
 
 constructor TParameters.Create;
 begin
+  inherited Create;
   fHelp:=false;
   fVersion:=false;
   fVerbose:=false;
   fInputFiles:=TStringList.Create;
+  fRCIncludeDirs:= TStringList.Create;
+  fRCIncludeDirs.Duplicates:= dupIgnore;
+  fRCDefines:= TStringList.Create;
   fOutputFile:='';
   fTarget.machine:=mtnone;
   GetDefaultSubMachineForMachine(fTarget.machine);
@@ -398,7 +449,10 @@ end;
 
 destructor TParameters.Destroy;
 begin
+  fRCDefines.Free;
+  fRCIncludeDirs.Free;
   fInputFiles.Free;
+  inherited;
 end;
 
 end.

+ 33 - 6
utils/fpcres/sourcehandler.pas

@@ -36,33 +36,46 @@ type
   private
   protected
     fFileList : TStringList;
+    fRCIncludeDirs: TStringList;
+    fRCDefines: TStringList;
     fStreamList : TFPList;
+    fRCMode: Boolean;
   public
     constructor Create;
     destructor Destroy; override;
     procedure Load(aResources : TResources);
     property FileList : TStringList read fFileList;
+    property RCIncludeDirs: TStringList read fRCIncludeDirs;
+    property RCDefines: TStringList read fRCDefines;
+    property RCMode: Boolean read fRCMode write fRCMode;
   end;
   
 implementation
 
-uses msghandler, closablefilestream;
+uses msghandler, closablefilestream, rcreader;
 
 { TSourceFiles }
 
 constructor TSourceFiles.Create;
 begin
+  inherited Create;
   fFileList:=TStringList.Create;
   fStreamList:=TFPList.Create;
+  fRCDefines:= TStringList.Create;
+  fRCIncludeDirs:= TStringList.Create;
+  fRCMode:=False;
 end;
 
 destructor TSourceFiles.Destroy;
 var i : integer;
 begin
+  fRCIncludeDirs.Free;
+  fRCDefines.Free;
   fFileList.Free;
   for i:=0 to fStreamList.Count-1 do
     TStream(fStreamList[i]).Free;
   fStreamList.Free;
+  inherited;
 end;
 
 procedure TSourceFiles.Load(aResources: TResources);
@@ -70,7 +83,9 @@ var aReader : TAbstractResourceReader;
     aStream : TClosableFileStream;
     i : integer;
     tmpres : TResources;
+    olddir : String;
 begin
+  olddir:=GetCurrentDir;
   tmpres:=TResources.Create;
   try
     for i:=0 to fFileList.Count-1 do
@@ -82,18 +97,30 @@ begin
         raise ECantOpenFileException.Create(fFileList[i]);
       end;
       fStreamList.Add(aStream);
-      try
-        aReader:=TResources.FindReader(aStream);
-      except
-        raise EUnknownInputFormatException.Create(fFileList[i]);
-      end;
+      { the RC reader reads anything, so handle that separately }
+      if fRCMode then
+        aReader:=TRCResourceReader.Create
+      else
+        try
+          aReader:=TResources.FindReader(aStream);
+        except
+          raise EUnknownInputFormatException.Create(fFileList[i]);
+        end;
       Messages.DoVerbose(Format('Chosen reader: %s',[aReader.Description]));
       try
         Messages.DoVerbose('Reading resource information...');
+        if aReader is TRCResourceReader then begin
+          TRCResourceReader(aReader).RCIncludeDirs.Assign(fRCIncludeDirs);
+          TRCResourceReader(aReader).RCDefines.Assign(fRCDefines);
+          SetCurrentDir(ExtractFilePath(ExpandFileName(fFileList[i])));
+        end;
         tmpres.LoadFromStream(aStream,aReader);
         aResources.MoveFrom(tmpres);
         Messages.DoVerbose('Resource information read');
       finally
+        if aReader is TRCResourceReader then begin
+          SetCurrentDir(olddir);
+        end;
         aReader.Free;
       end;
     end;

+ 2 - 4
utils/tply/fpmake.pp

@@ -39,6 +39,8 @@ begin
     P.Directory:=ADirectory;
     P.Version:='3.3.1';
 
+    P.Dependencies.Add('tplylib');
+
     P.Options.Add('-Sg');
 
     T:=P.Targets.AddProgram('plex.pas');
@@ -62,10 +64,6 @@ begin
     T.Dependencies.AddUnit('yacclr0');
     T.Dependencies.AddUnit('yacctabl');
 
-
-    P.Targets.AddUnit('lexlib.pas');
-    P.Targets.AddUnit('yacclib.pas');
-
     P.Targets.AddUnit('lexbase.pas').install:=false;
     P.Targets.AddUnit('lexopt.pas').install:=false;
     P.Targets.AddUnit('lexdfa.pas').install:=false;

+ 2 - 1
utils/tply/lexdfa.pas

@@ -53,7 +53,8 @@ procedure makeDFATable;
   begin
     (* initialize start states: *)
     for i := 2 to 2*n_start_states+1 do
-      setunion(first_pos_table^[i]^, first_pos_table^[i mod 2]^);
+      if not start_excl^[i div 2] then
+        setunion(first_pos_table^[i]^, first_pos_table^[i mod 2]^);
     for i := 0 to 2*n_start_states+1 do
       act_state := newState(first_pos_table^[i]);
     act_state := -1;

+ 4 - 0
utils/tply/lextable.pas

@@ -105,6 +105,8 @@ FirstPosTable  = array [0..2*max_start_states+1] of IntSetPtr;
                       default, states 2..2*n_start_states+1 user-defined
                       start states) *)
 
+StartStateExclusive = array[0..max_start_states] of Boolean;
+
 StateTableEntry = record
                     state_pos : IntSetPtr;
                       (* positions covered by state *)
@@ -137,6 +139,7 @@ optimize          : Boolean;          (* status of the optimization option *)
 sym_table         : ^SymTable;        (* symbol table *)
 pos_table         : ^PosTable;        (* position table *)
 first_pos_table   : ^FirstPosTable;   (* first positions table *)
+start_excl        : ^StartStateExclusive; (* user-defined start state type *)
 state_table       : ^StateTable;      (* DFA state table *)
 trans_table       : ^TransTable;      (* DFA transition table *)
 
@@ -460,6 +463,7 @@ begin
   new(sym_table);
   new(pos_table);
   new(first_pos_table);
+  new(start_excl);
   new(state_table);
   new(trans_table);
 

+ 4 - 3
utils/tply/plex.pas

@@ -88,7 +88,7 @@ procedure next_section;
 
 var n_rules : Integer; (* current number of rules *)
 
-procedure define_start_state ( symbol : String; pos : Integer );
+procedure define_start_state ( symbol : String; pos : Integer; excl : Boolean );
   (* process start state definition *)
   begin
 {$ifdef fpc}
@@ -106,6 +106,7 @@ procedure define_start_state ( symbol : String; pos : Integer );
           writeln(yyout, 'const ', symbol, ' = ', 2*start_state, ';');
           first_pos_table^[2*start_state] := newIntSet;
           first_pos_table^[2*start_state+1] := newIntSet;
+          start_excl^[start_state] := excl;
         end
       else
         error(symbol_already_defined, pos)
@@ -505,12 +506,12 @@ procedure definitions;
     begin
       split(line, 2);
       com := upper(itemv(1));
-      if (com='%S') or (com='%START') then
+      if (com='%S') or (com='%START') or (com='%X') then
         begin
           split(line, max_items);
           for i := 2 to itemc do
             if check_id(itemv(i)) then
-              define_start_state(itemv(i), itempos[i])
+              define_start_state(itemv(i), itempos[i], com='%X')
             else
               error(syntax_error, itempos[i]);
         end