Przeglądaj źródła

+ support for a different set of compiler directives under $MODE MAC
+ added mac directives $SETC $IFC $ELSEC $ENDC

olle 22 lat temu
rodzic
commit
6f78eac09f
2 zmienionych plików z 210 dodań i 108 usunięć
  1. 79 75
      compiler/scandir.pas
  2. 131 33
      compiler/scanner.pas

+ 79 - 75
compiler/scandir.pas

@@ -898,84 +898,84 @@ implementation
 
     procedure InitScannerDirectives;
       begin
-        AddDirective('ALIGN',{$ifdef FPCPROCVAR}@{$endif}dir_align);
+        AddDirective('ALIGN',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_align);
 {$ifdef m68k}
-        AddDirective('APPID',{$ifdef FPCPROCVAR}@{$endif}dir_appid);
-        AddDirective('APPNAME',{$ifdef FPCPROCVAR}@{$endif}dir_appname);
+        AddDirective('APPID',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_appid);
+        AddDirective('APPNAME',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_appname);
 {$endif m68k}
-        AddDirective('APPTYPE',{$ifdef FPCPROCVAR}@{$endif}dir_apptype);
-        AddDirective('ASMMODE',{$ifdef FPCPROCVAR}@{$endif}dir_asmmode);
-        AddDirective('ASSERTIONS',{$ifdef FPCPROCVAR}@{$endif}dir_assertions);
-        AddDirective('BOOLEVAL',{$ifdef FPCPROCVAR}@{$endif}dir_booleval);
-        AddDirective('CALLING',{$ifdef FPCPROCVAR}@{$endif}dir_calling);
-        AddDirective('CODEPAGE',{$ifdef FPCPROCVAR}@{$endif}dir_codepage);
-        AddDirective('COPYRIGHT',{$ifdef FPCPROCVAR}@{$endif}dir_copyright);
-        AddDirective('D',{$ifdef FPCPROCVAR}@{$endif}dir_description);
-        AddDirective('DEBUGINFO',{$ifdef FPCPROCVAR}@{$endif}dir_debuginfo);
-        AddDirective('DESCRIPTION',{$ifdef FPCPROCVAR}@{$endif}dir_description);
-        AddDirective('ERROR',{$ifdef FPCPROCVAR}@{$endif}dir_error);
-        AddDirective('EXTENDEDSYNTAX',{$ifdef FPCPROCVAR}@{$endif}dir_extendedsyntax);
-        AddDirective('EXTERNALSYM',{$ifdef FPCPROCVAR}@{$endif}dir_externalsym);
-        AddDirective('FATAL',{$ifdef FPCPROCVAR}@{$endif}dir_fatal);
-        AddDirective('GOTO',{$ifdef FPCPROCVAR}@{$endif}dir_goto);
-        AddDirective('HINT',{$ifdef FPCPROCVAR}@{$endif}dir_hint);
-        AddDirective('HINTS',{$ifdef FPCPROCVAR}@{$endif}dir_hints);
-        AddDirective('IOCHECKS',{$ifdef FPCPROCVAR}@{$endif}dir_iochecks);
-        AddDirective('IMPLICITEXCEPTIONS',{$ifdef FPCPROCVAR}@{$endif}dir_implicitexceptions);
-        AddDirective('INCLUDEPATH',{$ifdef FPCPROCVAR}@{$endif}dir_includepath);
-        AddDirective('INFO',{$ifdef FPCPROCVAR}@{$endif}dir_info);
-        AddDirective('INLINE',{$ifdef FPCPROCVAR}@{$endif}dir_inline);
-        AddDirective('INTERFACES',{$ifdef FPCPROCVAR}@{$endif}dir_interfaces);
-        AddDirective('L',{$ifdef FPCPROCVAR}@{$endif}dir_link);
-        AddDirective('LIBRARYPATH',{$ifdef FPCPROCVAR}@{$endif}dir_librarypath);
-        AddDirective('LINK',{$ifdef FPCPROCVAR}@{$endif}dir_link);
-        AddDirective('LINKLIB',{$ifdef FPCPROCVAR}@{$endif}dir_linklib);
-        AddDirective('LOCALSYMBOLS',{$ifdef FPCPROCVAR}@{$endif}dir_localsymbols);
-        AddDirective('LONGSTRINGS',{$ifdef FPCPROCVAR}@{$endif}dir_longstrings);
-        AddDirective('M',{$ifdef FPCPROCVAR}@{$endif}dir_memory);
-        AddDirective('MACRO',{$ifdef FPCPROCVAR}@{$endif}dir_macro);
-        AddDirective('MAXFPUREGISTERS',{$ifdef FPCPROCVAR}@{$endif}dir_maxfpuregisters);
-        AddDirective('MEMORY',{$ifdef FPCPROCVAR}@{$endif}dir_memory);
-        AddDirective('MESSAGE',{$ifdef FPCPROCVAR}@{$endif}dir_message);
-        AddDirective('MINENUMSIZE',{$ifdef FPCPROCVAR}@{$endif}dir_packenum);
-        AddDirective('MMX',{$ifdef FPCPROCVAR}@{$endif}dir_mmx);
-        AddDirective('MODE',{$ifdef FPCPROCVAR}@{$endif}dir_mode);
-        AddDirective('NOTE',{$ifdef FPCPROCVAR}@{$endif}dir_note);
-        AddDirective('NOTES',{$ifdef FPCPROCVAR}@{$endif}dir_notes);
-        AddDirective('OBJECTCHECKS',{$ifdef FPCPROCVAR}@{$endif}dir_objectchecks);
-        AddDirective('OBJECTPATH',{$ifdef FPCPROCVAR}@{$endif}dir_objectpath);
-        AddDirective('OPENSTRINGS',{$ifdef FPCPROCVAR}@{$endif}dir_openstrings);
-        AddDirective('OUTPUT_FORMAT',{$ifdef FPCPROCVAR}@{$endif}dir_output_format);
-        AddDirective('OVERFLOWCHECKS',{$ifdef FPCPROCVAR}@{$endif}dir_overflowchecks);
-        AddDirective('PACKENUM',{$ifdef FPCPROCVAR}@{$endif}dir_packenum);
-        AddDirective('PACKRECORDS',{$ifdef FPCPROCVAR}@{$endif}dir_packrecords);
+        AddDirective('APPTYPE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_apptype);
+        AddDirective('ASMMODE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_asmmode);
+        AddDirective('ASSERTIONS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_assertions);
+        AddDirective('BOOLEVAL',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_booleval);
+        AddDirective('CALLING',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_calling);
+        AddDirective('CODEPAGE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_codepage);
+        AddDirective('COPYRIGHT',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_copyright);
+        AddDirective('D',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_description);
+        AddDirective('DEBUGINFO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_debuginfo);
+        AddDirective('DESCRIPTION',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_description);
+        AddDirective('ERROR',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_error);
+        AddDirective('EXTENDEDSYNTAX',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_extendedsyntax);
+        AddDirective('EXTERNALSYM',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_externalsym);
+        AddDirective('FATAL',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_fatal);
+        AddDirective('GOTO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_goto);
+        AddDirective('HINT',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_hint);
+        AddDirective('HINTS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_hints);
+        AddDirective('IOCHECKS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_iochecks);
+        AddDirective('IMPLICITEXCEPTIONS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_implicitexceptions);
+        AddDirective('INCLUDEPATH',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_includepath);
+        AddDirective('INFO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_info);
+        AddDirective('INLINE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_inline);
+        AddDirective('INTERFACES',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_interfaces);
+        AddDirective('L',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_link);
+        AddDirective('LIBRARYPATH',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_librarypath);
+        AddDirective('LINK',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_link);
+        AddDirective('LINKLIB',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_linklib);
+        AddDirective('LOCALSYMBOLS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_localsymbols);
+        AddDirective('LONGSTRINGS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_longstrings);
+        AddDirective('M',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_memory);
+        AddDirective('MACRO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_macro);
+        AddDirective('MAXFPUREGISTERS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_maxfpuregisters);
+        AddDirective('MEMORY',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_memory);
+        AddDirective('MESSAGE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_message);
+        AddDirective('MINENUMSIZE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_packenum);
+        AddDirective('MMX',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_mmx);
+        AddDirective('MODE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_mode);
+        AddDirective('NOTE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_note);
+        AddDirective('NOTES',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_notes);
+        AddDirective('OBJECTCHECKS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_objectchecks);
+        AddDirective('OBJECTPATH',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_objectpath);
+        AddDirective('OPENSTRINGS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_openstrings);
+        AddDirective('OUTPUT_FORMAT',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_output_format);
+        AddDirective('OVERFLOWCHECKS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_overflowchecks);
+        AddDirective('PACKENUM',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_packenum);
+        AddDirective('PACKRECORDS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_packrecords);
 {$IFDEF TestVarsets}
-        AddDirective('PACKSET',{$ifdef FPCPROCVAR}@{$endif}dir_packset);
+        AddDirective('PACKSET',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_packset);
 {$ENDIF}
-        AddDirective('PROFILE',{$ifdef FPCPROCVAR}@{$endif}dir_profile);
-        AddDirective('R',{$ifdef FPCPROCVAR}@{$endif}dir_resource);
-        AddDirective('RANGECHECKS',{$ifdef FPCPROCVAR}@{$endif}dir_rangechecks);
-        AddDirective('REFERENCEINFO',{$ifdef FPCPROCVAR}@{$endif}dir_referenceinfo);
-        AddDirective('SATURATION',{$ifdef FPCPROCVAR}@{$endif}dir_saturation);
-        AddDirective('SCREENNAME',{$ifdef FPCPROCVAR}@{$endif}dir_screenname);
-        AddDirective('SMARTLINK',{$ifdef FPCPROCVAR}@{$endif}dir_smartlink);
-        AddDirective('STACKFRAMES',{$ifdef FPCPROCVAR}@{$endif}dir_stackframes);
-        AddDirective('STATIC',{$ifdef FPCPROCVAR}@{$endif}dir_static);
-        AddDirective('STOP',{$ifdef FPCPROCVAR}@{$endif}dir_stop);
-        AddDirective('THREADING',{$ifdef FPCPROCVAR}@{$endif}dir_threading);
-        AddDirective('THREADNAME',{$ifdef FPCPROCVAR}@{$endif}dir_threadname);
-        AddDirective('TYPEDADDRESS',{$ifdef FPCPROCVAR}@{$endif}dir_typedaddress);
-        AddDirective('TYPEINFO',{$ifdef FPCPROCVAR}@{$endif}dir_typeinfo);
-        AddDirective('UNITPATH',{$ifdef FPCPROCVAR}@{$endif}dir_unitpath);
-        AddDirective('VARSTRINGCHECKS',{$ifdef FPCPROCVAR}@{$endif}dir_varstringchecks);
-        AddDirective('VERSION',{$ifdef FPCPROCVAR}@{$endif}dir_version);
-        AddDirective('WAIT',{$ifdef FPCPROCVAR}@{$endif}dir_wait);
-        AddDirective('WARNING',{$ifdef FPCPROCVAR}@{$endif}dir_warning);
-        AddDirective('WARNINGS',{$ifdef FPCPROCVAR}@{$endif}dir_warnings);
-        AddDirective('WRITEABLECONST',{$ifdef FPCPROCVAR}@{$endif}dir_writeableconst);
-        AddDirective('Z1',{$ifdef FPCPROCVAR}@{$endif}dir_z1);
-        AddDirective('Z2',{$ifdef FPCPROCVAR}@{$endif}dir_z2);
-        AddDirective('Z4',{$ifdef FPCPROCVAR}@{$endif}dir_z4);
+        AddDirective('PROFILE',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_profile);
+        AddDirective('R',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_resource);
+        AddDirective('RANGECHECKS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_rangechecks);
+        AddDirective('REFERENCEINFO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_referenceinfo);
+        AddDirective('SATURATION',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_saturation);
+        AddDirective('SCREENNAME',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_screenname);
+        AddDirective('SMARTLINK',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_smartlink);
+        AddDirective('STACKFRAMES',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_stackframes);
+        AddDirective('STATIC',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_static);
+        AddDirective('STOP',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_stop);
+        AddDirective('THREADING',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_threading);
+        AddDirective('THREADNAME',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_threadname);
+        AddDirective('TYPEDADDRESS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_typedaddress);
+        AddDirective('TYPEINFO',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_typeinfo);
+        AddDirective('UNITPATH',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_unitpath);
+        AddDirective('VARSTRINGCHECKS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_varstringchecks);
+        AddDirective('VERSION',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_version);
+        AddDirective('WAIT',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_wait);
+        AddDirective('WARNING',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_warning);
+        AddDirective('WARNINGS',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_warnings);
+        AddDirective('WRITEABLECONST',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_writeableconst);
+        AddDirective('Z1',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_z1);
+        AddDirective('Z2',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_z2);
+        AddDirective('Z4',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_z4);
       end;
 
 
@@ -983,7 +983,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.25  2003-03-23 23:20:38  hajny
+  Revision 1.26  2003-09-17 22:30:19  olle
+    + support for a different set of compiler directives under $MODE MAC
+    + added mac directives $SETC $IFC $ELSEC $ENDC
+
+  Revision 1.25  2003/03/23 23:20:38  hajny
     + emx target added
 
   Revision 1.24  2003/01/03 21:25:01  peter

+ 131 - 33
compiler/scanner.pas

@@ -180,15 +180,16 @@ interface
 
         current_scanner : tscannerfile;  { current scanner in use }
 
-        scannerdirectives : tdictionary; { dictionary with the supported directives }
-
         aktcommentstyle : tcommentstyle; { needed to use read_comment from directives }
 {$ifdef PREPROCWRITE}
         preprocfile     : tpreprocfile;  { used with only preprocessing }
 {$endif PREPROCWRITE}
 
-    procedure adddirective(const s:string;p:tdirectiveproc);
-    procedure addconditional(const s:string;p:tdirectiveproc);
+    type
+        tdirectivemode = (directive_all, directive_turbo, directive_mac);
+
+    procedure AddDirective(const s:string; dm: tdirectivemode; p:tdirectiveproc);
+    procedure AddConditional(const s:string; dm: tdirectivemode; p:tdirectiveproc);
 
     procedure InitScanner;
     procedure DoneScanner;
@@ -207,6 +208,12 @@ implementation
       switches,
       fmodule;
 
+    var
+      { dictionaries with the supported directives }
+      turbo_scannerdirectives : tdictionary;     { for other modes }
+      mac_scannerdirectives : tdictionary;       { for mode mac }
+
+
 {*****************************************************************************
                               Helper routines
 *****************************************************************************}
@@ -309,7 +316,7 @@ implementation
       end;
 
 
-    procedure dir_if;
+    function parse_compiler_expr:string;
 
         function read_expr : string; forward;
 
@@ -522,16 +529,21 @@ implementation
              read_expr:='0';
         end;
 
-      var
-        hs : string;
-      begin
+     begin
         current_scanner.skipspace;
         { start preproc expression scanner }
         current_scanner.preproc_token:=current_scanner.readpreproc;
-        hs:=read_expr;
-        current_scanner.addpreprocstack(pp_if,hs<>'0',hs,scan_c_if_found);
+        parse_compiler_expr:=read_expr;
       end;
 
+    procedure dir_if;
+
+      var
+        hs : string;
+      begin
+        hs:=parse_compiler_expr;
+        current_scanner.addpreprocstack(pp_if,hs<>'0',hs,scan_c_if_found);
+      end;
 
     procedure dir_define;
       var
@@ -625,6 +637,68 @@ implementation
           end;
       end;
 
+    procedure dir_setc;
+      var
+        hs  : string;
+        mac : tmacro;
+      begin
+        current_scanner.skipspace;
+        hs:=current_scanner.readid;
+        mac:=tmacro(current_scanner.macros.search(hs));
+        if not assigned(mac) then
+          begin
+            mac:=tmacro.create(hs);
+            mac.defined:=true;
+            Message1(parser_c_macro_defined,mac.name);
+            current_scanner.macros.insert(mac);
+          end
+        else
+          begin
+            Message1(parser_c_macro_defined,mac.name);
+            mac.defined:=true;
+          { delete old definition }
+            if assigned(mac.buftext) then
+             begin
+               freemem(mac.buftext,mac.buflen);
+               mac.buftext:=nil;
+             end;
+          end;
+        mac.is_used:=true;
+
+
+        { key words are never substituted }
+           if is_keyword(hs) then
+            Message(scan_e_keyword_cant_be_a_macro);
+         { !!!!!! handle macro params, need we this? }
+           current_scanner.skipspace;
+         { may be a macro? }
+
+        //both versions with := and = are allowed
+        if c=':' then
+          current_scanner.readchar;
+
+        if c='=' then
+          begin
+             current_scanner.readchar;
+             hs:= parse_compiler_expr;
+             if length(hs) <> 0 then
+               begin
+                 { free buffer of macro ?}
+                 if assigned(mac.buftext) then
+                   freemem(mac.buftext,mac.buflen);
+                 { get new mem }
+                 getmem(mac.buftext,length(hs));
+                 mac.buflen:=length(hs);
+                 { copy the text }
+                 move(hs[1],mac.buftext^,mac.buflen);
+               end
+             else
+               Message(scan_e_preproc_syntax_error);
+          end
+        else
+          Message(scan_e_preproc_syntax_error);
+      end;
+
 
     procedure dir_undef;
       var
@@ -1376,7 +1450,10 @@ implementation
              Message(scan_c_skipping_until);
              repeat
                current_scanner.skipuntildirective;
-               p:=tdirectiveitem(scannerdirectives.search(current_scanner.readid));
+               if not (m_mac in aktmodeswitches) then
+                 p:=tdirectiveitem(turbo_scannerdirectives.search(current_scanner.readid))
+               else
+                 p:=tdirectiveitem(mac_scannerdirectives.search(current_scanner.readid));
              until assigned(p) and (p.is_conditional);
              current_scanner.gettokenpos;
              Message1(scan_d_handling_switch,'$'+p.name);
@@ -1448,7 +1525,11 @@ implementation
       { directives may follow switches after a , }
          if hs<>'' then
           begin
-            t:=tdirectiveitem(scannerdirectives.search(hs));
+            if not (m_mac in aktmodeswitches) then
+              t:=tdirectiveitem(turbo_scannerdirectives.search(hs))
+            else
+              t:=tdirectiveitem(mac_scannerdirectives.search(hs));
+
             if assigned(t) then
              begin
                if t.is_conditional then
@@ -2767,18 +2848,22 @@ exit_label:
                                    Helpers
 *****************************************************************************}
 
-    procedure adddirective(const s:string;p:tdirectiveproc);
+    procedure AddDirective(const s:string; dm: tdirectivemode; p:tdirectiveproc);
       begin
-        scannerdirectives.insert(tdirectiveitem.create(s,p));
+        if dm in [directive_all, directive_turbo] then
+          turbo_scannerdirectives.insert(tdirectiveitem.create(s,p));
+        if dm in [directive_all, directive_mac] then
+          mac_scannerdirectives.insert(tdirectiveitem.create(s,p));
       end;
 
-
-    procedure addconditional(const s:string;p:tdirectiveproc);
+    procedure AddConditional(const s:string; dm: tdirectivemode; p:tdirectiveproc);
       begin
-        scannerdirectives.insert(tdirectiveitem.createcond(s,p));
+        if dm in [directive_all, directive_turbo] then
+          turbo_scannerdirectives.insert(tdirectiveitem.createcond(s,p));
+        if dm in [directive_all, directive_mac] then
+          mac_scannerdirectives.insert(tdirectiveitem.createcond(s,p));
       end;
 
-
 {*****************************************************************************
                                 Initialization
 *****************************************************************************}
@@ -2786,25 +2871,34 @@ exit_label:
     procedure InitScanner;
       begin
         InitWideString(patternw);
-        scannerdirectives:=TDictionary.Create;
-        { Default directives }
-        AddDirective('DEFINE',{$ifdef FPCPROCVAR}@{$endif}dir_define);
-        AddDirective('UNDEF',{$ifdef FPCPROCVAR}@{$endif}dir_undef);
-        AddDirective('I',{$ifdef FPCPROCVAR}@{$endif}dir_include);
-        AddDirective('INCLUDE',{$ifdef FPCPROCVAR}@{$endif}dir_include);
-        { Default conditionals }
-        AddConditional('ELSE',{$ifdef FPCPROCVAR}@{$endif}dir_else);
-        AddConditional('ENDIF',{$ifdef FPCPROCVAR}@{$endif}dir_endif);
-        AddConditional('IF',{$ifdef FPCPROCVAR}@{$endif}dir_if);
-        AddConditional('IFDEF',{$ifdef FPCPROCVAR}@{$endif}dir_ifdef);
-        AddConditional('IFNDEF',{$ifdef FPCPROCVAR}@{$endif}dir_ifndef);
-        AddConditional('IFOPT',{$ifdef FPCPROCVAR}@{$endif}dir_ifopt);
+        turbo_scannerdirectives:=TDictionary.Create;
+        mac_scannerdirectives:=TDictionary.Create;
+
+        { Default Turbo directives and conditionals }
+        AddDirective('DEFINE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_define);
+        AddDirective('UNDEF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_undef);
+        AddDirective('I',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_include);
+        AddDirective('INCLUDE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_include);
+
+        AddConditional('ELSE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_else);
+        AddConditional('ENDIF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_endif);
+        AddConditional('IF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_if);
+        AddConditional('IFDEF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_ifdef);
+        AddConditional('IFNDEF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_ifndef);
+        AddConditional('IFOPT',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_ifopt);
+
+        { Default Mac directives and conditionals: }
+        AddDirective('SETC',directive_mac, {$ifdef FPCPROCVAR}@{$endif}dir_setc);
+        AddConditional('IFC',directive_mac, {$ifdef FPCPROCVAR}@{$endif}dir_if);
+        AddConditional('ELSEC',directive_mac, {$ifdef FPCPROCVAR}@{$endif}dir_else);
+        AddConditional('ENDC',directive_mac, {$ifdef FPCPROCVAR}@{$endif}dir_endif);
       end;
 
 
     procedure DoneScanner;
       begin
-        scannerdirectives.Free;
+        turbo_scannerdirectives.Free;
+        mac_scannerdirectives.Free;
         DoneWideString(patternw);
       end;
 
@@ -2812,7 +2906,11 @@ exit_label:
 end.
 {
   $Log$
-  Revision 1.61  2003-09-03 11:18:37  florian
+  Revision 1.62  2003-09-17 22:30:19  olle
+    + support for a different set of compiler directives under $MODE MAC
+    + added mac directives $SETC $IFC $ELSEC $ENDC
+
+  Revision 1.61  2003/09/03 11:18:37  florian
     * fixed arm concatcopy
     + arm support in the common compiler sources added
     * moved some generic cg code around