summaryrefslogtreecommitdiff
path: root/compiler/switches.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/switches.pas')
-rw-r--r--compiler/switches.pas228
1 files changed, 228 insertions, 0 deletions
diff --git a/compiler/switches.pas b/compiler/switches.pas
new file mode 100644
index 0000000000..9f7549c7af
--- /dev/null
+++ b/compiler/switches.pas
@@ -0,0 +1,228 @@
+{
+ Copyright (c) 1998-2002 by Peter Vreman
+
+ This unit implements the parsing of the switches like $I-
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+unit switches;
+
+{$i fpcdefs.inc}
+
+interface
+
+procedure HandleSwitch(switch,state:char);
+function CheckSwitch(switch,state:char):boolean;
+
+
+implementation
+uses
+ globtype,systems,
+ globals,verbose,fmodule;
+
+{****************************************************************************
+ Main Switches Parsing
+****************************************************************************}
+
+type
+ TSwitchType=(ignoredsw,localsw,modulesw,globalsw,illegalsw,unsupportedsw,alignsw);
+ SwitchRec=record
+ typesw : TSwitchType;
+ setsw : byte;
+ end;
+ SwitchRecTable = array['A'..'Z'] of SwitchRec;
+
+const
+ turboSwitchTable: SwitchRecTable =(
+ {A} (typesw:alignsw; setsw:ord(cs_localnone)),
+ {B} (typesw:localsw; setsw:ord(cs_full_boolean_eval)),
+ {C} (typesw:localsw; setsw:ord(cs_do_assertion)),
+ {D} (typesw:modulesw; setsw:ord(cs_debuginfo)),
+ {E} (typesw:modulesw; setsw:ord(cs_fp_emulation)),
+ {F} (typesw:ignoredsw; setsw:ord(cs_localnone)),
+ {G} (typesw:ignoredsw; setsw:ord(cs_localnone)),
+ {H} (typesw:localsw; setsw:ord(cs_ansistrings)),
+ {I} (typesw:localsw; setsw:ord(cs_check_io)),
+ {J} (typesw:localsw; setsw:ord(cs_typed_const_writable)),
+ {K} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {L} (typesw:modulesw; setsw:ord(cs_local_browser)),
+ {M} (typesw:localsw; setsw:ord(cs_generate_rtti)),
+ {N} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {O} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {P} (typesw:modulesw; setsw:ord(cs_openstring)),
+ {Q} (typesw:localsw; setsw:ord(cs_check_overflow)),
+ {R} (typesw:localsw; setsw:ord(cs_check_range)),
+ {S} (typesw:localsw; setsw:ord(cs_check_stack)),
+ {T} (typesw:localsw; setsw:ord(cs_typed_addresses)),
+ {U} (typesw:illegalsw; setsw:ord(cs_localnone)),
+ {V} (typesw:localsw; setsw:ord(cs_strict_var_strings)),
+ {W} (typesw:localsw; setsw:ord(cs_generate_stackframes)),
+ {X} (typesw:modulesw; setsw:ord(cs_extsyntax)),
+ {Y} (typesw:modulesw; setsw:ord(cs_browser)),
+ {Z} (typesw:illegalsw; setsw:ord(cs_localnone))
+ );
+
+
+ macSwitchTable: SwitchRecTable =(
+ {A} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {B} (typesw:localsw; setsw:ord(cs_full_boolean_eval)),
+ {C} (typesw:localsw; setsw:ord(cs_do_assertion)),
+ {D} (typesw:modulesw; setsw:ord(cs_debuginfo)),
+ {E} (typesw:modulesw; setsw:ord(cs_fp_emulation)),
+ {F} (typesw:ignoredsw; setsw:ord(cs_localnone)),
+ {G} (typesw:ignoredsw; setsw:ord(cs_localnone)),
+ {H} (typesw:localsw; setsw:ord(cs_ansistrings)),
+ {I} (typesw:localsw; setsw:ord(cs_check_io)),
+ {J} (typesw:localsw; setsw:ord(cs_external_var)),
+ {K} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {L} (typesw:modulesw; setsw:ord(cs_local_browser)),
+ {M} (typesw:localsw; setsw:ord(cs_generate_rtti)),
+ {N} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {O} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
+ {P} (typesw:modulesw; setsw:ord(cs_openstring)),
+ {Q} (typesw:localsw; setsw:ord(cs_check_overflow)),
+ {R} (typesw:localsw; setsw:ord(cs_check_range)),
+ {S} (typesw:localsw; setsw:ord(cs_check_stack)),
+ {T} (typesw:localsw; setsw:ord(cs_typed_addresses)),
+ {U} (typesw:illegalsw; setsw:ord(cs_localnone)),
+ {V} (typesw:localsw; setsw:ord(cs_strict_var_strings)),
+ {W} (typesw:localsw; setsw:ord(cs_generate_stackframes)),
+ {X} (typesw:modulesw; setsw:ord(cs_extsyntax)),
+ {Y} (typesw:modulesw; setsw:ord(cs_browser)),
+ {Z} (typesw:localsw; setsw:ord(cs_externally_visible))
+ );
+
+procedure HandleSwitch(switch,state:char);
+
+var
+ switchTablePtr: ^SwitchRecTable;
+
+begin
+ switch:=upcase(switch);
+{ Is the Switch in the letters ? }
+ if not ((switch in ['A'..'Z']) and (state in ['-','+'])) then
+ begin
+ Message(scan_w_illegal_switch);
+ exit;
+ end;
+
+{ Select switch table }
+ if m_mac in aktmodeswitches then
+ switchTablePtr:= @macSwitchTable
+ else
+ switchTablePtr:= @turboSwitchTable;
+
+{ Handle the switch }
+ with switchTablePtr^[switch] do
+ begin
+ case typesw of
+ alignsw:
+ if state='+' then
+ aktpackrecords:=4
+ else
+ aktpackrecords:=1;
+ ignoredsw :
+ Message1(scan_n_ignored_switch,'$'+switch);
+ illegalsw :
+ Message1(scan_w_illegal_switch,'$'+switch);
+ unsupportedsw :
+ Message1(scan_w_unsupported_switch,'$'+switch);
+ localsw :
+ begin
+ if not localswitcheschanged then
+ nextaktlocalswitches:=aktlocalswitches;
+ if state='+' then
+ include(nextaktlocalswitches,tlocalswitch(setsw))
+ else
+ exclude(nextaktlocalswitches,tlocalswitch(setsw));
+ localswitcheschanged:=true;
+ end;
+ modulesw :
+ begin
+ if current_module.in_global then
+ begin
+ if state='+' then
+ include(aktmoduleswitches,tmoduleswitch(setsw))
+ else
+ begin
+ { Turning off debuginfo when lineinfo is requested
+ is not possible }
+ if not((cs_use_lineinfo in aktglobalswitches) and
+ (tmoduleswitch(setsw)=cs_debuginfo)) then
+ exclude(aktmoduleswitches,tmoduleswitch(setsw));
+ end;
+ end
+ else
+ Message(scan_w_switch_is_global);
+ end;
+ globalsw :
+ begin
+ if current_module.in_global and (current_module=main_module) then
+ begin
+ if state='+' then
+ include(aktglobalswitches,tglobalswitch(setsw))
+ else
+ exclude(aktglobalswitches,tglobalswitch(setsw));
+ end
+ else
+ Message(scan_w_switch_is_global);
+ end;
+ end;
+ end;
+end;
+
+
+function CheckSwitch(switch,state:char):boolean;
+
+var
+ found : boolean;
+ switchTablePtr: ^SwitchRecTable;
+
+begin
+ switch:=upcase(switch);
+{ Is the Switch in the letters ? }
+ if not ((switch in ['A'..'Z']) and (state in ['-','+'])) then
+ begin
+ Message(scan_w_illegal_switch);
+ CheckSwitch:=false;
+ exit;
+ end;
+
+{ Select switch table }
+ if m_mac in aktmodeswitches then
+ switchTablePtr:= @macSwitchTable
+ else
+ switchTablePtr:= @turboSwitchTable;
+
+{ Check the switch }
+ with switchTablePtr^[switch] do
+ begin
+ case typesw of
+ localsw : found:=(tlocalswitch(setsw) in aktlocalswitches);
+ modulesw : found:=(tmoduleswitch(setsw) in aktmoduleswitches);
+ globalsw : found:=(tglobalswitch(setsw) in aktglobalswitches);
+ else
+ found:=false;
+ end;
+ if state='-' then
+ found:=not found;
+ CheckSwitch:=found;
+ end;
+end;
+
+
+end.