fpc/compiler/scandir.pas
2006-04-12 07:58:25 +00:00

1269 lines
37 KiB
ObjectPascal

{
Copyright (c) 1998-2002 by Peter Vreman
This unit implements directive parsing for the scanner
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 scandir;
{$i fpcdefs.inc}
interface
procedure InitScannerDirectives;
implementation
uses
cutils,
globtype,globals,systems,widestr,cpuinfo,
verbose,comphook,ppu,
scanner,switches,
fmodule,
symtable,
rabase;
const
localswitchesstackmax = 20;
var
localswitchesstack: array[0..localswitchesstackmax] of tlocalswitches;
localswitchesstackpos: Integer;
{*****************************************************************************
Helpers
*****************************************************************************}
procedure do_delphiswitch(sw:char);
var
state : char;
begin
{ c contains the next char, a + or - would be fine }
state:=current_scanner.readstate;
if state in ['-','+'] then
HandleSwitch(sw,state);
end;
procedure do_setverbose(flag:char);
var
state : char;
begin
{ support ON/OFF }
state:=current_scanner.ReadState;
SetVerbosity(flag+state);
end;
procedure do_moduleswitch(sw:tmoduleswitch);
var
state : char;
begin
state:=current_scanner.readstate;
if (sw<>cs_modulenone) and (state in ['-','+']) then
begin
if state='-' then
exclude(aktmoduleswitches,sw)
else
include(aktmoduleswitches,sw);
end;
end;
procedure do_localswitch(sw:tlocalswitch);
var
state : char;
begin
state:=current_scanner.readstate;
if (sw<>cs_localnone) and (state in ['-','+']) then
begin
if not localswitcheschanged then
nextaktlocalswitches:=aktlocalswitches;
if state='-' then
exclude(nextaktlocalswitches,sw)
else
include(nextaktlocalswitches,sw);
localswitcheschanged:=true;
end;
end;
procedure do_localswitchdefault(sw:tlocalswitch);
var
state : char;
begin
state:=current_scanner.readstatedefault;
if (sw<>cs_localnone) and (state in ['-','+','*']) then
begin
if not localswitcheschanged then
nextaktlocalswitches:=aktlocalswitches;
if state='-' then
exclude(nextaktlocalswitches,sw)
else
if state='+' then
include(nextaktlocalswitches,sw)
else
begin
if sw in initlocalswitches then
include(nextaktlocalswitches,sw)
else
exclude(nextaktlocalswitches,sw);
end;
localswitcheschanged:=true;
end;
end;
procedure do_message(w:integer);
begin
current_scanner.skipspace;
Message1(w,current_scanner.readcomment);
end;
{*****************************************************************************
Directive Callbacks
*****************************************************************************}
procedure dir_align;
var
hs : string;
begin
current_scanner.skipspace;
if not(c in ['0'..'9']) then
begin
{ Support also the ON and OFF as switch }
hs:=current_scanner.readid;
if (hs='ON') then
aktpackrecords:=4
else if (hs='OFF') then
aktpackrecords:=1
else if m_mac in aktmodeswitches then
begin
{ Support switches used in Apples Universal Interfaces}
if (hs='MAC68K') then
aktpackrecords:=2
else if (hs='POWER') then
aktpackrecords:=4
else if (hs='RESET') then
aktpackrecords:=0
else
Message1(scan_e_illegal_pack_records,hs);
end
else
Message1(scan_e_illegal_pack_records,hs);
end
else
begin
case current_scanner.readval of
1 : aktpackrecords:=1;
2 : aktpackrecords:=2;
4 : aktpackrecords:=4;
8 : aktpackrecords:=8;
16 : aktpackrecords:=16;
32 : aktpackrecords:=32;
else
Message1(scan_e_illegal_pack_records,hs);
end;
end;
end;
procedure dir_a1;
begin
aktpackrecords:=1;
end;
procedure dir_a2;
begin
aktpackrecords:=2;
end;
procedure dir_a4;
begin
aktpackrecords:=4;
end;
procedure dir_a8;
begin
aktpackrecords:=8;
end;
procedure dir_asmmode;
var
s : string;
begin
current_scanner.skipspace;
s:=current_scanner.readid;
If Inside_asm_statement then
Message1(scan_w_no_asm_reader_switch_inside_asm,s);
if s='DEFAULT' then
aktasmmode:=initasmmode
else
if not SetAsmReadMode(s,aktasmmode) then
Message1(scan_e_illegal_asmmode_specifier,s);
end;
{$if defined(m68k) or defined(arm)}
procedure dir_appid;
begin
if target_info.system<>system_m68k_palmos then
Message(scan_w_appid_not_support);
{ change description global var in all cases }
{ it not used but in win32 and os2 }
current_scanner.skipspace;
palmos_applicationid:=current_scanner.readcomment;
end;
procedure dir_appname;
begin
if target_info.system<>system_m68k_palmos then
Message(scan_w_appname_not_support);
{ change description global var in all cases }
{ it not used but in win32 and os2 }
current_scanner.skipspace;
palmos_applicationname:=current_scanner.readcomment;
end;
{$endif defined(m68k) or defined(arm)}
procedure dir_apptype;
var
hs : string;
begin
if not (target_info.system in system_all_windows + [system_i386_os2,
system_i386_emx, system_powerpc_macos]) then
begin
if m_delphi in aktmodeswitches then
Message(scan_n_app_type_not_support)
else
Message(scan_w_app_type_not_support);
end
else
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
hs:=current_scanner.readid;
if hs='GUI' then
apptype:=app_gui
else if hs='CONSOLE' then
apptype:=app_cui
else if (hs='NATIVE') and (target_info.system in system_windows) then
apptype:=app_native
else if (hs='FS') and (target_info.system in [system_i386_os2,
system_i386_emx]) then
apptype:=app_fs
else if (hs='TOOL') and (target_info.system in [system_powerpc_macos]) then
apptype:=app_tool
else
Message1(scan_w_unsupported_app_type,hs);
end;
end;
end;
procedure dir_calling;
var
hs : string;
begin
current_scanner.skipspace;
hs:=current_scanner.readid;
if not SetAktProcCall(hs,aktdefproccall) then
begin
if (hs <> '') then
Message1(parser_w_unknown_proc_directive_ignored,hs)
else
Message(parser_e_proc_directive_expected);
end;
end;
procedure dir_checkpointer;
begin
do_localswitchdefault(cs_checkpointer);
end;
procedure dir_objectchecks;
begin
do_localswitch(cs_check_object);
end;
procedure dir_assertions;
begin
do_delphiswitch('C');
end;
procedure dir_booleval;
begin
do_delphiswitch('B');
end;
procedure dir_debuginfo;
begin
do_delphiswitch('D');
end;
procedure dir_description;
begin
if not (target_info.system in [system_i386_os2,system_i386_emx,
system_i386_win32,system_i386_netware,system_i386_wdosx,system_i386_netwlibc]) then
Message(scan_w_description_not_support);
{ change description global var in all cases }
{ it not used but in win32, os2 and netware }
current_scanner.skipspace;
description:=current_scanner.readcomment;
DescriptionSetExplicity:=true;
end;
procedure dir_screenname; {ad}
begin
if not (target_info.system in [system_i386_netware,system_i386_netwlibc]) then
{Message(scan_w_decription_not_support);}
comment (V_Warning,'Screenname only supported for target netware');
current_scanner.skipspace;
nwscreenname:=current_scanner.readcomment;
end;
procedure dir_threadname; {ad}
begin
if not (target_info.system in [system_i386_netware,system_i386_netwlibc]) then
{Message(scan_w_decription_not_support);}
comment (V_Warning,'Threadname only supported for target netware');
current_scanner.skipspace;
nwthreadname:=current_scanner.readcomment;
end;
procedure dir_copyright; {ad}
begin
if not (target_info.system in [system_i386_netware,system_i386_netwlibc]) then
{Message(scan_w_decription_not_support);}
comment (V_Warning,'Copyright only supported for target netware');
current_scanner.skipspace;
nwcopyright:=current_scanner.readcomment;
end;
procedure dir_error;
begin
do_message(scan_e_user_defined);
end;
procedure dir_extendedsyntax;
begin
do_delphiswitch('X');
end;
procedure dir_fatal;
begin
do_message(scan_f_user_defined);
end;
procedure dir_fputype;
begin
current_scanner.skipspace;
{ current_scanner.undef_macro('FPU'+fputypestr[aktfputype]); }
if not(SetFPUType(upper(current_scanner.readcomment),aktfputype)) then
comment(V_Error,'Illegal FPU type');
{ current_scanner.def_macro('FPU'+fputypestr[aktfputype]); }
end;
procedure dir_goto;
begin
do_moduleswitch(cs_support_goto);
end;
procedure dir_hint;
begin
do_message(scan_h_user_defined);
end;
procedure dir_hints;
begin
do_setverbose('H');
end;
procedure dir_implicitexceptions;
begin
do_moduleswitch(cs_implicit_exceptions);
end;
procedure dir_includepath;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
current_module.localincludesearchpath.AddPath(current_scanner.readcomment,false);
end;
end;
procedure dir_info;
begin
do_message(scan_i_user_defined);
end;
procedure dir_inline;
begin
do_moduleswitch(cs_support_inline);
end;
procedure dir_interfaces;
var
hs : string;
begin
{corba/com/default}
current_scanner.skipspace;
hs:=current_scanner.readid;
if (hs='CORBA') then
aktinterfacetype:=it_interfacecorba
else if (hs='COM') then
aktinterfacetype:=it_interfacecom
else if (hs='DEFAULT') then
aktinterfacetype:=initinterfacetype
else
Message(scan_e_invalid_interface_type);
end;
procedure dir_iochecks;
begin
do_delphiswitch('I');
end;
procedure dir_libexport;
begin
{not implemented}
end;
procedure dir_librarypath;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
current_module.locallibrarysearchpath.AddPath(current_scanner.readcomment,false);
end;
end;
procedure dir_link;
var
s : string;
begin
current_scanner.skipspace;
if scanner.c = '''' then
begin
s:= current_scanner.readquotedstring;
current_scanner.readcomment
end
else
s:= trimspace(current_scanner.readcomment);
s:=AddExtension(FixFileName(s),target_info.objext);
current_module.linkotherofiles.add(s,link_always);
end;
procedure dir_linklib;
type
tLinkMode=(lm_shared,lm_static);
var
s : string;
quote : char;
libext,
libname,
linkmodestr : string;
p : longint;
linkMode : tLinkMode;
begin
current_scanner.skipspace;
if scanner.c = '''' then
begin
libname:= current_scanner.readquotedstring;
s:= current_scanner.readcomment;
p:=pos(',',s);
end
else
begin
s:= current_scanner.readcomment;
p:=pos(',',s);
if p=0 then
libname:=TrimSpace(s)
else
libname:=TrimSpace(copy(s,1,p-1));
end;
if p=0 then
linkmodeStr:=''
else
linkmodeStr:=Upper(TrimSpace(copy(s,p+1,255)));
if (libname='') or (libname='''''') or (libname='""') then
exit;
{ create library name }
if libname[1] in ['''','"'] then
begin
quote:=libname[1];
Delete(libname,1,1);
p:=pos(quote,libname);
if p>0 then
Delete(libname,p,1);
end;
libname:=FixFileName(libname);
{ get linkmode, default is to check the extension for
the static library, otherwise shared linking is assumed }
linkmode:=lm_shared;
if linkModeStr='' then
begin
libext:=SplitExtension(libname);
if libext=target_info.staticClibext then
linkMode:=lm_static;
end
else if linkModeStr='STATIC' then
linkmode:=lm_static
else if (LinkModeStr='SHARED') or (LinkModeStr='') then
linkmode:=lm_shared
else
Comment(V_Error,'Wrong link mode specified: "'+Linkmodestr+'"');
{ add to the list of other libraries }
if linkMode=lm_static then
current_module.linkOtherStaticLibs.add(libname,link_always)
else
current_module.linkOtherSharedLibs.add(libname,link_always);
end;
procedure dir_localsymbols;
begin
do_delphiswitch('L');
end;
procedure dir_longstrings;
begin
do_delphiswitch('H');
end;
procedure dir_macro;
begin
do_moduleswitch(cs_support_macro);
end;
procedure dir_maxfpuregisters;
var
l : integer;
hs : string;
begin
current_scanner.skipspace;
if not(c in ['0'..'9']) then
begin
hs:=current_scanner.readid;
if (hs='NORMAL') or (hs='DEFAULT') then
aktmaxfpuregisters:=-1
else
Message(scan_e_invalid_maxfpureg_value);
end
else
begin
l:=current_scanner.readval;
case l of
0..8:
aktmaxfpuregisters:=l;
else
Message(scan_e_invalid_maxfpureg_value);
end;
end;
end;
procedure dir_memory;
var
l : longint;
begin
current_scanner.skipspace;
l:=current_scanner.readval;
if l>1024 then
stacksize:=l;
if c=',' then
begin
current_scanner.readchar;
current_scanner.skipspace;
l:=current_scanner.readval;
if l>1024 then
heapsize:=l;
end;
end;
procedure dir_message;
var
hs : string;
w : longint;
begin
w:=0;
current_scanner.skipspace;
{ Message level specified? }
if c='''' then
w:=scan_n_user_defined
else
begin
hs:=current_scanner.readid;
if (hs='WARN') or (hs='WARNING') then
w:=scan_w_user_defined
else
if (hs='ERROR') then
w:=scan_e_user_defined
else
if (hs='FATAL') then
w:=scan_f_user_defined
else
if (hs='HINT') then
w:=scan_h_user_defined
else
if (hs='NOTE') then
w:=scan_n_user_defined
else
Message1(scan_w_illegal_directive,hs);
end;
{ Only print message when there was no error }
if w<>0 then
begin
current_scanner.skipspace;
if c='''' then
hs:=current_scanner.readquotedstring
else
hs:=current_scanner.readcomment;
Message1(w,hs);
end
else
current_scanner.readcomment;
end;
procedure dir_mode;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
current_scanner.readstring;
if not current_module.mode_switch_allowed and
not ((m_mac in aktmodeswitches) and (pattern='MACPAS')) then
Message1(scan_e_mode_switch_not_allowed,pattern)
else if not SetCompileMode(pattern,false) then
Message1(scan_w_illegal_switch,pattern)
end;
current_module.mode_switch_allowed:= false;
end;
procedure dir_mmx;
begin
do_localswitch(cs_mmx);
end;
procedure dir_note;
begin
do_message(scan_n_user_defined);
end;
procedure dir_notes;
begin
do_setverbose('N');
end;
procedure dir_objectpath;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
current_module.localobjectsearchpath.AddPath(current_scanner.readcomment,false);
end;
end;
procedure dir_openstrings;
begin
do_delphiswitch('P');
end;
procedure dir_optimization;
var
hs : string;
begin
current_scanner.skipspace;
{ Support also the ON and OFF as switch }
hs:=current_scanner.readid;
if (hs='ON') then
aktoptimizerswitches:=level2optimizerswitches
else if (hs='OFF') then
aktoptimizerswitches:=[]
else if (hs='DEFAULT') then
aktoptimizerswitches:=initoptimizerswitches
else
begin
if not UpdateOptimizerStr(hs,aktoptimizerswitches) then
Message1(scan_e_illegal_optimization_specifier,hs);
end;
end;
procedure dir_overflowchecks;
begin
do_delphiswitch('Q');
end;
procedure dir_packenum;
var
hs : string;
begin
current_scanner.skipspace;
if not(c in ['0'..'9']) then
begin
hs:=current_scanner.readid;
if (hs='NORMAL') or (hs='DEFAULT') then
aktpackenum:=4
else
Message1(scan_e_illegal_pack_enum, hs);
end
else
begin
case current_scanner.readval of
1 : aktpackenum:=1;
2 : aktpackenum:=2;
4 : aktpackenum:=4;
else
Message1(scan_e_illegal_pack_enum, pattern);
end;
end;
end;
procedure dir_packrecords;
var
hs : string;
begin
current_scanner.skipspace;
if not(c in ['0'..'9']) then
begin
hs:=current_scanner.readid;
{ C has the special recordalignmax of -1 }
if (hs='C') then
aktpackrecords:=-1
else
if (hs='NORMAL') or (hs='DEFAULT') then
aktpackrecords:=0
else
Message1(scan_e_illegal_pack_records,hs);
end
else
begin
case current_scanner.readval of
1 : aktpackrecords:=1;
2 : aktpackrecords:=2;
4 : aktpackrecords:=4;
8 : aktpackrecords:=8;
16 : aktpackrecords:=16;
32 : aktpackrecords:=32;
else
Message1(scan_e_illegal_pack_records,pattern);
end;
end;
end;
{$ifdef testvarsets}
procedure dir_packset;
var
hs : string;
begin
current_scanner.skipspace;
if not(c in ['1','2','4']) then
begin
hs:=current_scanner.readid;
if (hs='FIXED') or ((hs='DEFAULT') OR (hs='NORMAL')) then
aktsetalloc:=0 {Fixed mode, sets are 4 or 32 bytes}
else
Message(scan_w_only_packset);
end
else
begin
case current_scanner.readval of
1 : aktsetalloc:=1;
2 : aktsetalloc:=2;
4 : aktsetalloc:=4;
else
Message(scan_w_only_packset);
end;
end;
end;
{$ENDIF}
procedure dir_pic;
begin
do_moduleswitch(cs_create_pic);
end;
procedure dir_pop;
begin
if localswitchesstackpos < 1 then
Message(scan_e_too_many_pop);
if not localswitcheschanged then
nextaktlocalswitches:=aktlocalswitches;
Dec(localswitchesstackpos);
nextaktlocalswitches:= localswitchesstack[localswitchesstackpos];
localswitcheschanged:=true;
end;
procedure dir_profile;
begin
do_moduleswitch(cs_profile);
{ defined/undefine FPC_PROFILE }
if cs_profile in aktmoduleswitches then
def_system_macro('FPC_PROFILE')
else
undef_system_macro('FPC_PROFILE');
end;
procedure dir_push;
begin
if localswitchesstackpos > localswitchesstackmax then
Message(scan_e_too_many_push);
if localswitcheschanged then
begin
aktlocalswitches:=nextaktlocalswitches;
localswitcheschanged:=false;
end;
localswitchesstack[localswitchesstackpos]:= aktlocalswitches;
Inc(localswitchesstackpos);
end;
procedure dir_rangechecks;
begin
do_delphiswitch('R');
end;
procedure dir_referenceinfo;
begin
do_delphiswitch('Y');
end;
procedure dir_resource;
var
s : string;
begin
current_scanner.skipspace;
if scanner.c = '''' then
begin
s:= current_scanner.readquotedstring;
current_scanner.readcomment
end
else
s:= trimspace(current_scanner.readcomment);
{ replace * with current module name.
This should always be defined. }
if s[1]='*' then
if Assigned(Current_Module) then
begin
delete(S,1,1);
if m_delphi in aktmodeswitches then
insert(current_module.realmodulename^,S,1)
else
insert(lower(current_module.modulename^),S,1);
end;
s:=AddExtension(FixFileName(s),target_info.resext);
if target_info.res<>res_none then
begin
current_module.flags:=current_module.flags or uf_has_resourcefiles;
if (target_info.res = res_emxbind) and
not (Current_module.ResourceFiles.Empty) then
Message(scan_w_only_one_resourcefile_supported)
else
current_module.resourcefiles.insert(FixFileName(s));
end
else
Message(scan_e_resourcefiles_not_supported);
end;
procedure dir_saturation;
begin
do_localswitch(cs_mmx_saturation);
end;
procedure dir_smartlink;
begin
do_moduleswitch(cs_create_smart);
end;
procedure dir_stackframes;
begin
do_delphiswitch('W');
end;
procedure dir_static;
begin
do_moduleswitch(cs_static_keyword);
end;
procedure dir_stop;
begin
do_message(scan_f_user_defined);
end;
{$ifdef powerpc}
procedure dir_syscall;
var
sctype : string;
begin
{ not needed on amiga/m68k for now, because there's only one }
{ syscall convention (legacy) (KB) }
{ not needed on amiga/powerpc because there's only one }
{ syscall convention (sysv) (KB) }
if not (target_info.system in [system_powerpc_morphos]) then
comment (V_Warning,'Syscall directive is useless on this target.');
current_scanner.skipspace;
sctype:=current_scanner.readid;
if (sctype='LEGACY') or (sctype='SYSV') or (sctype='SYSVBASE') or
(sctype='BASESYSV') or (sctype='R12BASE') then
syscall_convention:=sctype
else
comment (V_Warning,'Invalid Syscall directive ignored.');
end;
{$endif}
procedure dir_typedaddress;
begin
do_delphiswitch('T');
end;
procedure dir_typeinfo;
begin
do_delphiswitch('M');
end;
procedure dir_unitpath;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
with current_scanner,current_module,localunitsearchpath do
begin
skipspace;
AddPath(path^,readcomment,false);
end;
end;
procedure dir_varstringchecks;
begin
do_delphiswitch('V');
end;
procedure dir_version;
var
major, minor, revision : longint;
error : integer;
begin
if not (target_info.system in [system_i386_os2,system_i386_emx,
system_i386_win32,system_i386_netware,system_i386_wdosx,
system_i386_netwlibc]) then
begin
Message(scan_n_version_not_support);
exit;
end;
if (compile_level<>1) then
Message(scan_n_only_exe_version)
else
begin
{ change description global var in all cases }
{ it not used but in win32, os2 and netware }
current_scanner.skipspace;
{ we should only accept Major.Minor format for win32 and os2 }
current_scanner.readnumber;
major:=0;
minor:=0;
revision:=0;
val(pattern,major,error);
if (error<>0) or (major > high(word)) or (major < 0) then
begin
Message1(scan_w_wrong_version_ignored,pattern);
exit;
end;
if c='.' then
begin
current_scanner.readchar;
current_scanner.readnumber;
val(pattern,minor,error);
if (error<>0) or (minor > high(word)) or (minor < 0) then
begin
Message1(scan_w_wrong_version_ignored,tostr(major)+'.'+pattern);
exit;
end;
if (c='.') and
(target_info.system in [system_i386_netware,system_i386_netwlibc]) then
begin
current_scanner.readchar;
current_scanner.readnumber;
val(pattern,revision,error);
if (error<>0) or (revision > high(word)) or (revision < 0) then
begin
Message1(scan_w_wrong_version_ignored,tostr(revision)+'.'+pattern);
exit;
end;
dllmajor:=word(major);
dllminor:=word(minor);
dllrevision:=word(revision);
dllversion:=tostr(major)+','+tostr(minor)+','+tostr(revision);
end
else
begin
dllmajor:=word(major);
dllminor:=word(minor);
dllversion:=tostr(major)+'.'+tostr(minor);
end;
end
else
dllversion:=tostr(major);
end;
end;
procedure dir_wait;
var
had_info : boolean;
begin
had_info:=(status.verbosity and V_Info)<>0;
{ this message should allways appear !! }
status.verbosity:=status.verbosity or V_Info;
Message(scan_i_press_enter);
readln;
If not(had_info) then
status.verbosity:=status.verbosity and (not V_Info);
end;
procedure dir_warn;
var
warning_string,state : string;
begin
current_scanner.skipspace;
warning_string:=current_scanner.readid;
if (upper(warning_string)='ON') then
begin
end
else if (upper(warning_string)='ON') then
else
begin
current_scanner.skipspace;
state:=current_scanner.readid;
end;
end;
procedure dir_warning;
begin
do_message(scan_w_user_defined);
end;
procedure dir_warnings;
begin
do_setverbose('W');
end;
procedure dir_writeableconst;
begin
do_delphiswitch('J');
end;
procedure dir_z1;
begin
aktpackenum:=1;
end;
procedure dir_z2;
begin
aktpackenum:=2;
end;
procedure dir_z4;
begin
aktpackenum:=4;
end;
procedure dir_externalsym;
begin
end;
procedure dir_nodefine;
begin
end;
procedure dir_hppemit;
begin
end;
procedure dir_weakpackageunit;
begin
end;
procedure dir_codealign;
var
s : string;
begin
current_scanner.skipspace;
s:=current_scanner.readcomment;
UpdateAlignmentStr(s,aktalignment);
end;
procedure dir_codepage;
var
s : string;
begin
if not current_module.in_global then
Message(scan_w_switch_is_global)
else
begin
current_scanner.skipspace;
s:=current_scanner.readcomment;
if (upper(s)='UTF8') or (upper(s)='UTF-8') then
aktsourcecodepage:='utf8'
else if not(cpavailable(s)) then
Message1(option_code_page_not_available,s)
else
aktsourcecodepage:=s;
end;
end;
procedure dir_coperators;
begin
do_moduleswitch(cs_support_c_operators);
end;
{****************************************************************************
Initialize Directives
****************************************************************************}
procedure InitScannerDirectives;
begin
AddDirective('A1',directive_all, @dir_a1);
AddDirective('A2',directive_all, @dir_a2);
AddDirective('A4',directive_all, @dir_a4);
AddDirective('A8',directive_all, @dir_a8);
AddDirective('ALIGN',directive_all, @dir_align);
{$ifdef m68k}
AddDirective('APPID',directive_all, @dir_appid);
AddDirective('APPNAME',directive_all, @dir_appname);
{$endif m68k}
AddDirective('APPTYPE',directive_all, @dir_apptype);
AddDirective('ASMMODE',directive_all, @dir_asmmode);
AddDirective('ASSERTIONS',directive_all, @dir_assertions);
AddDirective('BOOLEVAL',directive_all, @dir_booleval);
AddDirective('CALLING',directive_all, @dir_calling);
AddDirective('CHECKPOINTER',directive_all, @dir_checkpointer);
AddDirective('CODEALIGN',directive_all, @dir_codealign);
AddDirective('CODEPAGE',directive_all, @dir_codepage);
AddDirective('COPERATORS',directive_all, @dir_coperators);
AddDirective('COPYRIGHT',directive_all, @dir_copyright);
AddDirective('D',directive_all, @dir_description);
AddDirective('DEBUGINFO',directive_all, @dir_debuginfo);
AddDirective('DESCRIPTION',directive_all, @dir_description);
AddDirective('ERROR',directive_all, @dir_error);
AddDirective('ERRORC',directive_mac, @dir_error);
AddDirective('EXTENDEDSYNTAX',directive_all, @dir_extendedsyntax);
AddDirective('EXTERNALSYM',directive_all, @dir_externalsym);
AddDirective('FATAL',directive_all, @dir_fatal);
AddDirective('FPUTYPE',directive_all, @dir_fputype);
AddDirective('GOTO',directive_all, @dir_goto);
AddDirective('HINT',directive_all, @dir_hint);
AddDirective('HINTS',directive_all, @dir_hints);
AddDirective('HPPEMIT',directive_all, @dir_hppemit);
AddDirective('IOCHECKS',directive_all, @dir_iochecks);
AddDirective('IMPLICITEXCEPTIONS',directive_all, @dir_implicitexceptions);
AddDirective('INCLUDEPATH',directive_all, @dir_includepath);
AddDirective('INFO',directive_all, @dir_info);
AddDirective('INLINE',directive_all, @dir_inline);
AddDirective('INTERFACES',directive_all, @dir_interfaces);
AddDirective('L',directive_all, @dir_link);
AddDirective('LIBEXPORT',directive_mac, @dir_libexport);
AddDirective('LIBRARYPATH',directive_all, @dir_librarypath);
AddDirective('LINK',directive_all, @dir_link);
AddDirective('LINKLIB',directive_all, @dir_linklib);
AddDirective('LOCALSYMBOLS',directive_all, @dir_localsymbols);
AddDirective('LONGSTRINGS',directive_all, @dir_longstrings);
AddDirective('M',directive_all, @dir_memory);
AddDirective('MACRO',directive_all, @dir_macro);
AddDirective('MAXFPUREGISTERS',directive_all, @dir_maxfpuregisters);
AddDirective('MEMORY',directive_all, @dir_memory);
AddDirective('MESSAGE',directive_all, @dir_message);
AddDirective('MINENUMSIZE',directive_all, @dir_packenum);
AddDirective('MMX',directive_all, @dir_mmx);
AddDirective('MODE',directive_all, @dir_mode);
AddDirective('NODEFINE',directive_all, @dir_nodefine);
AddDirective('NOTE',directive_all, @dir_note);
AddDirective('NOTES',directive_all, @dir_notes);
AddDirective('OBJECTCHECKS',directive_all, @dir_objectchecks);
AddDirective('OBJECTPATH',directive_all, @dir_objectpath);
AddDirective('OPENSTRINGS',directive_all, @dir_openstrings);
AddDirective('OPTIMIZATION',directive_all, @dir_optimization);
AddDirective('OVERFLOWCHECKS',directive_all, @dir_overflowchecks);
AddDirective('PACKENUM',directive_all, @dir_packenum);
AddDirective('PACKRECORDS',directive_all, @dir_packrecords);
{$IFDEF TestVarsets}
AddDirective('PACKSET',directive_all, @dir_packset);
{$ENDIF}
AddDirective('PIC',directive_all, @dir_pic);
AddDirective('POP',directive_mac, @dir_pop);
AddDirective('PROFILE',directive_all, @dir_profile);
AddDirective('PUSH',directive_mac, @dir_push);
AddDirective('R',directive_all, @dir_resource);
AddDirective('RANGECHECKS',directive_all, @dir_rangechecks);
AddDirective('REFERENCEINFO',directive_all, @dir_referenceinfo);
AddDirective('RESOURCE',directive_all, @dir_resource);
AddDirective('SATURATION',directive_all, @dir_saturation);
AddDirective('SCREENNAME',directive_all, @dir_screenname);
AddDirective('SMARTLINK',directive_all, @dir_smartlink);
AddDirective('STACKFRAMES',directive_all, @dir_stackframes);
AddDirective('STATIC',directive_all, @dir_static);
AddDirective('STOP',directive_all, @dir_stop);
{$ifdef powerpc}
AddDirective('SYSCALL',directive_all, @dir_syscall);
{$endif powerpc}
AddDirective('THREADNAME',directive_all, @dir_threadname);
AddDirective('TYPEDADDRESS',directive_all, @dir_typedaddress);
AddDirective('TYPEINFO',directive_all, @dir_typeinfo);
AddDirective('UNITPATH',directive_all, @dir_unitpath);
AddDirective('VARSTRINGCHECKS',directive_all, @dir_varstringchecks);
AddDirective('VERSION',directive_all, @dir_version);
AddDirective('WAIT',directive_all, @dir_wait);
AddDirective('WARN',directive_all, @dir_warn);
AddDirective('WARNING',directive_all, @dir_warning);
AddDirective('WARNINGS',directive_all, @dir_warnings);
AddDirective('WEAKPACKAGEUNIT',directive_all, @dir_weakpackageunit);
AddDirective('WRITEABLECONST',directive_all, @dir_writeableconst);
AddDirective('Z1',directive_all, @dir_z1);
AddDirective('Z2',directive_all, @dir_z2);
AddDirective('Z4',directive_all, @dir_z4);
end;
begin
localswitchesstackpos:= 0;
end.