Browse Source

fcl-res: legacy resource flags

Reintegrate fpcres-rc branch by Martok

git-svn-id: trunk@46374 -
svenbarth 5 years ago
parent
commit
3765d1945e

+ 12 - 2
packages/fcl-res/src/rclex.inc

@@ -7,10 +7,20 @@ var
   strbuf: string;
 
 const
-  KeywordDefs: array [0..0] of TIdentMapEntry = (
-    (Value: _LANGUAGE; Name: 'LANGUAGE')
+  KeywordDefs: array [0..9] of TIdentMapEntry = (
+    (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')
   );
 
+
 function KeywordToInt(k: string; out kw: integer): boolean;
 var
   i: integer;

+ 12 - 2
packages/fcl-res/src/rclex.l

@@ -4,10 +4,20 @@ var
   strbuf: string;
 
 const
-  KeywordDefs: array [0..0] of TIdentMapEntry = (
-    (Value: _LANGUAGE; Name: 'LANGUAGE')
+  KeywordDefs: array [0..9] of TIdentMapEntry = (
+    (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')
   );
 
+
 function KeywordToInt(k: string; out kw: integer): boolean;
 var
   i: integer;

+ 429 - 154
packages/fcl-res/src/rcparser.pas

@@ -155,8 +155,16 @@ const _QUOTEDSTR = 262;
 const _BEGIN = 263;
 const _END = 264;
 const _LANGUAGE = 265;
-const _VERSION = 266;
-const _ID = 267;
+const _CHARACTERISTICS = 266;
+const _VERSION = 267;
+const _MOVEABLE = 268;
+const _FIXED = 269;
+const _PURE = 270;
+const _IMPURE = 271;
+const _PRELOAD = 272;
+const _LOADONCALL = 273;
+const _DISCARDABLE = 274;
+const _ID = 275;
 
 type YYSType = record case Integer of
                  1 : ( yyString : String );
@@ -214,54 +222,89 @@ begin
          yyval.yyTResourceDesc:= TResourceDesc.Create(yyv[yysp-0].yyString); 
        end;
   12 : begin
-         language:= MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
+         yyval := yyv[yysp-1];
        end;
   13 : begin
-         yyval := yyv[yysp-0];
+         aktresource.LangID:= MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
        end;
   14 : begin
-         yyval.yyrcnumtype.v:= StrToInt(yytext); yyval.yyrcnumtype.long:= False; 
+         aktresource.Characteristics:= yyv[yysp-0].yyrcnumtype.v; 
        end;
   15 : begin
-         yyval.yyrcnumtype.v:= StrToInt(Copy(yytext,1,length(yytext)-1)); yyval.yyrcnumtype.long:= True; 
+         aktresource.Version:= yyv[yysp-0].yyrcnumtype.v; 
        end;
   16 : begin
-         yyval.yyrcnumtype.v:= StrToInt('$'+Copy(yytext,3,Maxint)); yyval.yyrcnumtype.long:= False; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_MOVEABLE; 
        end;
   17 : begin
-         yyval.yyrcnumtype.v:= StrToInt('$'+Copy(yytext,3,length(yytext)-3)); yyval.yyrcnumtype.long:= True; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_MOVEABLE; 
        end;
   18 : begin
-         yyval.yyString:= yytext; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PURE; 
        end;
   19 : begin
-         yyval.yyString:= yytext; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PURE; 
        end;
   20 : begin
-         yyval.yyString:= yytext; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_PRELOAD; 
        end;
   21 : begin
-         yyval.yyString:= yytext; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags and not MF_PRELOAD; 
        end;
   22 : begin
-         yyval.yyTMemoryStream:= TMemoryStream.Create; 
+         aktresource.MemoryFlags:= aktresource.MemoryFlags or MF_DISCARDABLE; 
        end;
   23 : begin
-         yyval := yyv[yysp-1];
        end;
   24 : begin
-         yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream; 
+         language:= MakeLangID(yyv[yysp-2].yyrcnumtype.v, yyv[yysp-0].yyrcnumtype.v); 
        end;
   25 : begin
-         yyval := yyv[yysp-3];
+         yyval := yyv[yysp-0];
        end;
   26 : begin
+         yyval.yyrcnumtype.v:= StrToInt(yytext); yyval.yyrcnumtype.long:= False; 
+       end;
+  27 : begin
+         yyval.yyrcnumtype.v:= StrToInt(Copy(yytext,1,length(yytext)-1)); yyval.yyrcnumtype.long:= True; 
+       end;
+  28 : begin
+         yyval.yyrcnumtype.v:= StrToInt('$'+Copy(yytext,3,Maxint)); yyval.yyrcnumtype.long:= False; 
+       end;
+  29 : begin
+         yyval.yyrcnumtype.v:= StrToInt('$'+Copy(yytext,3,length(yytext)-3)); yyval.yyrcnumtype.long:= True; 
+       end;
+  30 : begin
+         yyval.yyString:= yytext; 
+       end;
+  31 : begin
+         yyval.yyString:= yytext; 
+       end;
+  32 : begin
+         yyval.yyString:= yytext; 
+       end;
+  33 : begin
+         yyval.yyString:= yytext; 
+       end;
+  34 : begin
+         yyval.yyTMemoryStream:= TMemoryStream.Create; 
+       end;
+  35 : begin
+         yyval := yyv[yysp-1];
+       end;
+  36 : begin
+         yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream; 
+       end;
+  37 : begin
+         yyval := yyv[yysp-3];
+       end;
+  38 : begin
          
          yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream;
          yyval.yyTMemoryStream.WriteBuffer(yyv[yysp-0].yyString[1], Length(yyv[yysp-0].yyString));
          
        end;
-  27 : begin
+  39 : begin
          
          yyval.yyTMemoryStream:= yyv[yysp-1].yyTMemoryStream;
          if yyv[yysp-0].yyrcnumtype.long then
@@ -284,10 +327,10 @@ type YYARec = record
 
 const
 
-yynacts   = 39;
-yyngotos  = 27;
-yynstates = 36;
-yynrules  = 27;
+yynacts   = 120;
+yyngotos  = 40;
+yynstates = 54;
+yynrules  = 39;
 
 yya : array [1..yynacts] of YYARec = (
 { 0: }
@@ -299,7 +342,7 @@ yya : array [1..yynacts] of YYARec = (
   ( sym: 261; act: 12 ),
   ( sym: 262; act: 13 ),
   ( sym: 265; act: 14 ),
-  ( sym: 267; act: 15 ),
+  ( sym: 275; act: 15 ),
 { 2: }
 { 3: }
 { 4: }
@@ -310,7 +353,7 @@ yya : array [1..yynacts] of YYARec = (
   ( sym: 260; act: 11 ),
   ( sym: 261; act: 12 ),
   ( sym: 262; act: 13 ),
-  ( sym: 267; act: 15 ),
+  ( sym: 275; act: 15 ),
 { 7: }
 { 8: }
 { 9: }
@@ -326,45 +369,144 @@ yya : array [1..yynacts] of YYARec = (
 { 15: }
 { 16: }
   ( sym: 262; act: -6 ),
+  ( sym: 265; act: -6 ),
+  ( sym: 266; act: -6 ),
+  ( sym: 267; act: -6 ),
+  ( sym: 268; act: -6 ),
+  ( sym: 269; act: -6 ),
+  ( sym: 270; act: -6 ),
+  ( sym: 271; act: -6 ),
+  ( sym: 272; act: -6 ),
+  ( sym: 273; act: -6 ),
+  ( sym: 274; act: -6 ),
   ( sym: 263; act: -8 ),
 { 17: }
 { 18: }
   ( sym: 44; act: 21 ),
 { 19: }
-  ( sym: 263; act: 22 ),
+  ( sym: 265; act: 23 ),
+  ( sym: 266; act: 24 ),
+  ( sym: 267; act: 25 ),
+  ( sym: 268; act: 26 ),
+  ( sym: 269; act: 27 ),
+  ( sym: 270; act: 28 ),
+  ( sym: 271; act: 29 ),
+  ( sym: 272; act: 30 ),
+  ( sym: 273; act: 31 ),
+  ( sym: 274; act: 32 ),
+  ( sym: 263; act: -23 ),
 { 20: }
-  ( sym: 262; act: 24 ),
+  ( sym: 265; act: 23 ),
+  ( sym: 266; act: 24 ),
+  ( sym: 267; act: 25 ),
+  ( sym: 268; act: 26 ),
+  ( sym: 269; act: 27 ),
+  ( sym: 270; act: 28 ),
+  ( sym: 271; act: 29 ),
+  ( sym: 272; act: 30 ),
+  ( sym: 273; act: 31 ),
+  ( sym: 274; act: 32 ),
+  ( sym: 262; act: -23 ),
 { 21: }
   ( sym: 258; act: 9 ),
   ( sym: 259; act: 10 ),
   ( sym: 260; act: 11 ),
   ( sym: 261; act: 12 ),
 { 22: }
+  ( sym: 263; act: 36 ),
+  ( sym: 265; act: 23 ),
+  ( sym: 266; act: 24 ),
+  ( sym: 267; act: 25 ),
+  ( sym: 268; act: 26 ),
+  ( sym: 269; act: 27 ),
+  ( sym: 270; act: 28 ),
+  ( sym: 271; act: 29 ),
+  ( sym: 272; act: 30 ),
+  ( sym: 273; act: 31 ),
+  ( sym: 274; act: 32 ),
 { 23: }
+  ( sym: 258; act: 9 ),
+  ( sym: 259; act: 10 ),
+  ( sym: 260; act: 11 ),
+  ( sym: 261; act: 12 ),
 { 24: }
+  ( sym: 258; act: 9 ),
+  ( sym: 259; act: 10 ),
+  ( sym: 260; act: 11 ),
+  ( sym: 261; act: 12 ),
 { 25: }
-{ 26: }
   ( sym: 258; act: 9 ),
   ( sym: 259; act: 10 ),
   ( sym: 260; act: 11 ),
   ( sym: 261; act: 12 ),
-  ( sym: 262; act: 31 ),
+{ 26: }
 { 27: }
-  ( sym: 44; act: 32 ),
-  ( sym: 264; act: 33 ),
 { 28: }
 { 29: }
 { 30: }
 { 31: }
 { 32: }
 { 33: }
+  ( sym: 262; act: 41 ),
+  ( sym: 265; act: 23 ),
+  ( sym: 266; act: 24 ),
+  ( sym: 267; act: 25 ),
+  ( sym: 268; act: 26 ),
+  ( sym: 269; act: 27 ),
+  ( sym: 270; act: 28 ),
+  ( sym: 271; act: 29 ),
+  ( sym: 272; act: 30 ),
+  ( sym: 273; act: 31 ),
+  ( sym: 274; act: 32 ),
 { 34: }
+{ 35: }
+  ( sym: 265; act: 23 ),
+  ( sym: 266; act: 24 ),
+  ( sym: 267; act: 25 ),
+  ( sym: 268; act: 26 ),
+  ( sym: 269; act: 27 ),
+  ( sym: 270; act: 28 ),
+  ( sym: 271; act: 29 ),
+  ( sym: 272; act: 30 ),
+  ( sym: 273; act: 31 ),
+  ( sym: 274; act: 32 ),
+  ( sym: 262; act: -12 ),
+  ( sym: 263; act: -12 ),
+{ 36: }
+{ 37: }
+  ( sym: 44; act: 44 ),
+{ 38: }
+{ 39: }
+{ 40: }
+{ 41: }
+{ 42: }
   ( sym: 258; act: 9 ),
   ( sym: 259; act: 10 ),
   ( sym: 260; act: 11 ),
   ( sym: 261; act: 12 ),
-  ( sym: 262; act: 31 )
-{ 35: }
+  ( sym: 262; act: 48 ),
+{ 43: }
+  ( sym: 44; act: 49 ),
+  ( sym: 264; act: 50 ),
+{ 44: }
+  ( sym: 258; act: 9 ),
+  ( sym: 259; act: 10 ),
+  ( sym: 260; act: 11 ),
+  ( sym: 261; act: 12 ),
+{ 45: }
+{ 46: }
+{ 47: }
+{ 48: }
+{ 49: }
+{ 50: }
+{ 51: }
+{ 52: }
+  ( sym: 258; act: 9 ),
+  ( sym: 259; act: 10 ),
+  ( sym: 260; act: 11 ),
+  ( sym: 261; act: 12 ),
+  ( sym: 262; act: 48 )
+{ 53: }
 );
 
 yyg : array [1..yyngotos] of YYARec = (
@@ -398,39 +540,70 @@ yyg : array [1..yyngotos] of YYARec = (
   ( sym: -2; act: 18 ),
 { 15: }
 { 16: }
-  ( sym: -16; act: 19 ),
-  ( sym: -15; act: 20 ),
+  ( sym: -17; act: 19 ),
+  ( sym: -16; act: 20 ),
 { 17: }
 { 18: }
 { 19: }
+  ( sym: -15; act: 22 ),
 { 20: }
-  ( sym: -5; act: 23 ),
+  ( sym: -15; act: 33 ),
 { 21: }
   ( sym: -3; act: 17 ),
-  ( sym: -2; act: 25 ),
+  ( sym: -2; act: 34 ),
 { 22: }
-  ( sym: -17; act: 26 ),
-  ( sym: -8; act: 27 ),
+  ( sym: -15; act: 35 ),
 { 23: }
+  ( sym: -3; act: 17 ),
+  ( sym: -2; act: 37 ),
 { 24: }
+  ( sym: -3; act: 17 ),
+  ( sym: -2; act: 38 ),
 { 25: }
+  ( sym: -3; act: 17 ),
+  ( sym: -2; act: 39 ),
 { 26: }
-  ( sym: -9; act: 28 ),
-  ( sym: -6; act: 29 ),
-  ( sym: -3; act: 30 ),
 { 27: }
 { 28: }
 { 29: }
 { 30: }
 { 31: }
 { 32: }
-  ( sym: -18; act: 34 ),
 { 33: }
+  ( sym: -15; act: 35 ),
+  ( sym: -5; act: 40 ),
 { 34: }
-  ( sym: -9; act: 35 ),
-  ( sym: -6; act: 29 ),
-  ( sym: -3; act: 30 )
 { 35: }
+  ( sym: -15; act: 35 ),
+{ 36: }
+  ( sym: -18; act: 42 ),
+  ( sym: -8; act: 43 ),
+{ 37: }
+{ 38: }
+{ 39: }
+{ 40: }
+{ 41: }
+{ 42: }
+  ( sym: -9; act: 45 ),
+  ( sym: -6; act: 46 ),
+  ( sym: -3; act: 47 ),
+{ 43: }
+{ 44: }
+  ( sym: -3; act: 17 ),
+  ( sym: -2; act: 51 ),
+{ 45: }
+{ 46: }
+{ 47: }
+{ 48: }
+{ 49: }
+  ( sym: -19; act: 52 ),
+{ 50: }
+{ 51: }
+{ 52: }
+  ( sym: -9; act: 53 ),
+  ( sym: -6; act: 46 ),
+  ( sym: -3; act: 47 )
+{ 53: }
 );
 
 yyd : array [0..yynstates-1] of Integer = (
@@ -443,33 +616,51 @@ yyd : array [0..yynstates-1] of Integer = (
 { 6: } 0,
 { 7: } -11,
 { 8: } -10,
-{ 9: } -14,
-{ 10: } -16,
-{ 11: } -15,
-{ 12: } -17,
-{ 13: } -19,
+{ 9: } -26,
+{ 10: } -28,
+{ 11: } -27,
+{ 12: } -29,
+{ 13: } -31,
 { 14: } 0,
-{ 15: } -18,
+{ 15: } -30,
 { 16: } 0,
-{ 17: } -13,
+{ 17: } -25,
 { 18: } 0,
 { 19: } 0,
 { 20: } 0,
 { 21: } 0,
-{ 22: } -22,
-{ 23: } -7,
-{ 24: } -20,
-{ 25: } -12,
-{ 26: } 0,
-{ 27: } 0,
-{ 28: } -23,
-{ 29: } -26,
-{ 30: } -27,
+{ 22: } 0,
+{ 23: } 0,
+{ 24: } 0,
+{ 25: } 0,
+{ 26: } -16,
+{ 27: } -17,
+{ 28: } -18,
+{ 29: } -19,
+{ 30: } -20,
 { 31: } -21,
-{ 32: } -24,
-{ 33: } -9,
-{ 34: } 0,
-{ 35: } -25
+{ 32: } -22,
+{ 33: } 0,
+{ 34: } -24,
+{ 35: } 0,
+{ 36: } -34,
+{ 37: } 0,
+{ 38: } -14,
+{ 39: } -15,
+{ 40: } -7,
+{ 41: } -32,
+{ 42: } 0,
+{ 43: } 0,
+{ 44: } 0,
+{ 45: } -35,
+{ 46: } -38,
+{ 47: } -39,
+{ 48: } -33,
+{ 49: } -36,
+{ 50: } -9,
+{ 51: } -13,
+{ 52: } 0,
+{ 53: } -37
 );
 
 yyal : array [0..yynstates-1] of Integer = (
@@ -490,25 +681,43 @@ yyal : array [0..yynstates-1] of Integer = (
 { 14: } 15,
 { 15: } 19,
 { 16: } 19,
-{ 17: } 21,
-{ 18: } 21,
-{ 19: } 22,
-{ 20: } 23,
-{ 21: } 24,
-{ 22: } 28,
-{ 23: } 28,
-{ 24: } 28,
-{ 25: } 28,
-{ 26: } 28,
-{ 27: } 33,
-{ 28: } 35,
-{ 29: } 35,
-{ 30: } 35,
-{ 31: } 35,
-{ 32: } 35,
-{ 33: } 35,
-{ 34: } 35,
-{ 35: } 40
+{ 17: } 31,
+{ 18: } 31,
+{ 19: } 32,
+{ 20: } 43,
+{ 21: } 54,
+{ 22: } 58,
+{ 23: } 69,
+{ 24: } 73,
+{ 25: } 77,
+{ 26: } 81,
+{ 27: } 81,
+{ 28: } 81,
+{ 29: } 81,
+{ 30: } 81,
+{ 31: } 81,
+{ 32: } 81,
+{ 33: } 81,
+{ 34: } 92,
+{ 35: } 92,
+{ 36: } 104,
+{ 37: } 104,
+{ 38: } 105,
+{ 39: } 105,
+{ 40: } 105,
+{ 41: } 105,
+{ 42: } 105,
+{ 43: } 110,
+{ 44: } 112,
+{ 45: } 116,
+{ 46: } 116,
+{ 47: } 116,
+{ 48: } 116,
+{ 49: } 116,
+{ 50: } 116,
+{ 51: } 116,
+{ 52: } 116,
+{ 53: } 121
 );
 
 yyah : array [0..yynstates-1] of Integer = (
@@ -528,26 +737,44 @@ yyah : array [0..yynstates-1] of Integer = (
 { 13: } 14,
 { 14: } 18,
 { 15: } 18,
-{ 16: } 20,
-{ 17: } 20,
-{ 18: } 21,
-{ 19: } 22,
-{ 20: } 23,
-{ 21: } 27,
-{ 22: } 27,
-{ 23: } 27,
-{ 24: } 27,
-{ 25: } 27,
-{ 26: } 32,
-{ 27: } 34,
-{ 28: } 34,
-{ 29: } 34,
-{ 30: } 34,
-{ 31: } 34,
-{ 32: } 34,
-{ 33: } 34,
-{ 34: } 39,
-{ 35: } 39
+{ 16: } 30,
+{ 17: } 30,
+{ 18: } 31,
+{ 19: } 42,
+{ 20: } 53,
+{ 21: } 57,
+{ 22: } 68,
+{ 23: } 72,
+{ 24: } 76,
+{ 25: } 80,
+{ 26: } 80,
+{ 27: } 80,
+{ 28: } 80,
+{ 29: } 80,
+{ 30: } 80,
+{ 31: } 80,
+{ 32: } 80,
+{ 33: } 91,
+{ 34: } 91,
+{ 35: } 103,
+{ 36: } 103,
+{ 37: } 104,
+{ 38: } 104,
+{ 39: } 104,
+{ 40: } 104,
+{ 41: } 104,
+{ 42: } 109,
+{ 43: } 111,
+{ 44: } 115,
+{ 45: } 115,
+{ 46: } 115,
+{ 47: } 115,
+{ 48: } 115,
+{ 49: } 115,
+{ 50: } 115,
+{ 51: } 115,
+{ 52: } 120,
+{ 53: } 120
 );
 
 yygl : array [0..yynstates-1] of Integer = (
@@ -571,22 +798,40 @@ yygl : array [0..yynstates-1] of Integer = (
 { 17: } 16,
 { 18: } 16,
 { 19: } 16,
-{ 20: } 16,
-{ 21: } 17,
-{ 22: } 19,
+{ 20: } 17,
+{ 21: } 18,
+{ 22: } 20,
 { 23: } 21,
-{ 24: } 21,
-{ 25: } 21,
-{ 26: } 21,
-{ 27: } 24,
-{ 28: } 24,
-{ 29: } 24,
-{ 30: } 24,
-{ 31: } 24,
-{ 32: } 24,
-{ 33: } 25,
-{ 34: } 25,
-{ 35: } 28
+{ 24: } 23,
+{ 25: } 25,
+{ 26: } 27,
+{ 27: } 27,
+{ 28: } 27,
+{ 29: } 27,
+{ 30: } 27,
+{ 31: } 27,
+{ 32: } 27,
+{ 33: } 27,
+{ 34: } 29,
+{ 35: } 29,
+{ 36: } 30,
+{ 37: } 32,
+{ 38: } 32,
+{ 39: } 32,
+{ 40: } 32,
+{ 41: } 32,
+{ 42: } 32,
+{ 43: } 35,
+{ 44: } 35,
+{ 45: } 37,
+{ 46: } 37,
+{ 47: } 37,
+{ 48: } 37,
+{ 49: } 37,
+{ 50: } 38,
+{ 51: } 38,
+{ 52: } 38,
+{ 53: } 41
 );
 
 yygh : array [0..yynstates-1] of Integer = (
@@ -609,23 +854,41 @@ yygh : array [0..yynstates-1] of Integer = (
 { 16: } 15,
 { 17: } 15,
 { 18: } 15,
-{ 19: } 15,
-{ 20: } 16,
-{ 21: } 18,
+{ 19: } 16,
+{ 20: } 17,
+{ 21: } 19,
 { 22: } 20,
-{ 23: } 20,
-{ 24: } 20,
-{ 25: } 20,
-{ 26: } 23,
-{ 27: } 23,
-{ 28: } 23,
-{ 29: } 23,
-{ 30: } 23,
-{ 31: } 23,
-{ 32: } 24,
-{ 33: } 24,
-{ 34: } 27,
-{ 35: } 27
+{ 23: } 22,
+{ 24: } 24,
+{ 25: } 26,
+{ 26: } 26,
+{ 27: } 26,
+{ 28: } 26,
+{ 29: } 26,
+{ 30: } 26,
+{ 31: } 26,
+{ 32: } 26,
+{ 33: } 28,
+{ 34: } 28,
+{ 35: } 29,
+{ 36: } 31,
+{ 37: } 31,
+{ 38: } 31,
+{ 39: } 31,
+{ 40: } 31,
+{ 41: } 31,
+{ 42: } 34,
+{ 43: } 34,
+{ 44: } 36,
+{ 45: } 36,
+{ 46: } 36,
+{ 47: } 36,
+{ 48: } 36,
+{ 49: } 37,
+{ 50: } 37,
+{ 51: } 37,
+{ 52: } 40,
+{ 53: } 40
 );
 
 yyr : array [1..yynrules] of YYRRec = (
@@ -634,28 +897,40 @@ yyr : array [1..yynrules] of YYRRec = (
 { 3: } ( len: 1; sym: -11 ),
 { 4: } ( len: 1; sym: -11 ),
 { 5: } ( len: 1; sym: -12 ),
-{ 6: } ( len: 0; sym: -15 ),
-{ 7: } ( len: 4; sym: -14 ),
-{ 8: } ( len: 0; sym: -16 ),
-{ 9: } ( len: 6; sym: -14 ),
+{ 6: } ( len: 0; sym: -16 ),
+{ 7: } ( len: 5; sym: -14 ),
+{ 8: } ( len: 0; sym: -17 ),
+{ 9: } ( len: 7; sym: -14 ),
 { 10: } ( len: 1; sym: -7 ),
 { 11: } ( len: 1; sym: -7 ),
-{ 12: } ( len: 4; sym: -13 ),
-{ 13: } ( len: 1; sym: -2 ),
-{ 14: } ( len: 1; sym: -3 ),
-{ 15: } ( len: 1; sym: -3 ),
-{ 16: } ( len: 1; sym: -3 ),
-{ 17: } ( len: 1; sym: -3 ),
-{ 18: } ( len: 1; sym: -4 ),
-{ 19: } ( len: 1; sym: -4 ),
-{ 20: } ( len: 1; sym: -5 ),
-{ 21: } ( len: 1; sym: -6 ),
-{ 22: } ( len: 0; sym: -17 ),
-{ 23: } ( len: 2; sym: -8 ),
-{ 24: } ( len: 0; sym: -18 ),
-{ 25: } ( len: 4; sym: -8 ),
-{ 26: } ( len: 1; sym: -9 ),
-{ 27: } ( len: 1; sym: -9 )
+{ 12: } ( len: 2; sym: -15 ),
+{ 13: } ( len: 4; sym: -15 ),
+{ 14: } ( len: 2; sym: -15 ),
+{ 15: } ( len: 2; sym: -15 ),
+{ 16: } ( len: 1; sym: -15 ),
+{ 17: } ( len: 1; sym: -15 ),
+{ 18: } ( len: 1; sym: -15 ),
+{ 19: } ( len: 1; sym: -15 ),
+{ 20: } ( len: 1; sym: -15 ),
+{ 21: } ( len: 1; sym: -15 ),
+{ 22: } ( len: 1; sym: -15 ),
+{ 23: } ( len: 0; sym: -15 ),
+{ 24: } ( len: 4; sym: -13 ),
+{ 25: } ( len: 1; sym: -2 ),
+{ 26: } ( len: 1; sym: -3 ),
+{ 27: } ( len: 1; sym: -3 ),
+{ 28: } ( len: 1; sym: -3 ),
+{ 29: } ( len: 1; sym: -3 ),
+{ 30: } ( len: 1; sym: -4 ),
+{ 31: } ( len: 1; sym: -4 ),
+{ 32: } ( len: 1; sym: -5 ),
+{ 33: } ( len: 1; sym: -6 ),
+{ 34: } ( len: 0; sym: -18 ),
+{ 35: } ( len: 2; sym: -8 ),
+{ 36: } ( len: 0; sym: -19 ),
+{ 37: } ( len: 4; sym: -8 ),
+{ 38: } ( len: 1; sym: -9 ),
+{ 39: } ( len: 1; sym: -9 )
 );
 
 

+ 19 - 3
packages/fcl-res/src/rcparser.y

@@ -147,7 +147,8 @@ var
 %token _ILLEGAL
 %token _NUMDECIMAL _NUMHEX _NUMDECIMALL _NUMHEXL _QUOTEDSTR
 %token _BEGIN _END
-%token _LANGUAGE _VERSION
+%token _LANGUAGE _CHARACTERISTICS _VERSION _MOVEABLE _FIXED _PURE _IMPURE _PRELOAD _LOADONCALL _DISCARDABLE
+
 %token _ID
 
 %type <rcnumtype> numpos numeral
@@ -172,8 +173,8 @@ resourcedef
     ;
 
 res_user
-    : resid resid { create_resource($1, $2); } filename_string                  { assign_custom_stream($4); }
-    | resid resid { create_resource($1, $2); } _BEGIN raw_data _END             { aktresource.SetCustomRawDataStream($5); }
+    : resid resid { create_resource($1, $2); } suboptions filename_string                  { assign_custom_stream($5); }
+    | resid resid { create_resource($1, $2); } suboptions _BEGIN raw_data _END             { aktresource.SetCustomRawDataStream($6); }
     ;
 
 
@@ -182,6 +183,21 @@ resid
     | ident_string                                 { $$:= TResourceDesc.Create($1); }
     ;
 
+suboptions
+    : suboptions suboptions
+    | _LANGUAGE numpos ',' numpos                  { aktresource.LangID:= 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; }
+    | /* empty */
+    ;
+
 languagedef
     : _LANGUAGE numpos ',' numpos                  { language:= MakeLangID($2.v, $4.v); }