| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599 | {    This file is part of the Free Pascal Integrated Development Environment    Copyright (c) 1998-2000 by Berczi Gabor    Compiler switches routines for the IDE    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 FPSwitch;interfaceuses  Objects,  Systems,  WUtils,  FPConst;const     MinMemSize      = 1024;     { min. local heap and stack size }     MaxMemSize      = 67107840; { max. local heap and stack size }type    TParamID =      (idNone,idAlign,idRangeChecks,idStackChecks,idIOChecks,       idOverflowChecks,idObjMethCallChecks,       idAsmDirect,idAsmATT,idAsmIntel,idAsmMot,idAsmStandard,       idSymInfNone,idSymInfGlobalOnly,idSymInfGlobalLocal,       idStackSize,idHeapSize,idStrictVarStrings,idExtendedSyntax,       idMMXOps,idTypedAddress,idPackRecords,idPackEnum,idStackFrames,       idReferenceInfo,idDebugInfo,idBoolEval,       idAnsiString,idTypeInfo);    TSwitchMode = (om_Normal,om_Debug,om_Release);    TSwitchItemTyp = (ot_Select,ot_Boolean,ot_String,ot_MultiString,ot_Longint);    PSwitchItem = ^TSwitchItem;    TSwitchItem = object(TObject)      Typ       : TSwitchItemTyp;      Name      : string[50];      Param     : string[10];      ParamID   : TParamID;      constructor Init(const n,p:string; AID: TParamID);      function  NeedParam:boolean;virtual;      function  ParamValue(nr:sw_integer):string;virtual;      function  ParamValueBool(SM: TSwitchMode):boolean;virtual;      function  ParamCount:sw_integer;virtual;      function  GetSwitchStr(SM: TSwitchMode): string; virtual;      function  GetNumberStr(SM: TSwitchMode): string; virtual;      function  GetOptionStr(SM: TSwitchMode): string; virtual;      procedure Reset;virtual;    end;    PSelectItem = ^TSelectItem;    TSelectItem = object(TSwitchItem)      IsDefault : boolean;      constructor Init(const n,p:string; AID: TParamID);      { Select to avoid anything in config file }      constructor InitDefault(const n:string);    end;    PBooleanItem = ^TBooleanItem;    TBooleanItem = object(TSwitchItem)      IsSet : array[TSwitchMode] of boolean;      constructor Init(const n,p:string; AID: TParamID);      function  NeedParam:boolean;virtual;      procedure Reset;virtual;      function  GetSwitchStr(SM: TSwitchMode): string; virtual;      function  ParamValueBool(SM: TSwitchMode):boolean;virtual;    end;    PStringItem = ^TStringItem;    TStringItem = object(TSwitchItem)      Str : array[TSwitchMode] of string;      multiple : boolean;      SeparateSpaces : boolean;      constructor Init(const n,p:string;AID: TParamID; mult,allowspaces:boolean);      function  NeedParam:boolean;virtual;      function  ParamValue(nr:sw_integer):string;virtual;      procedure Reset;virtual;    end;    PMultiStringItem = ^TMultiStringItem;    TMultiStringItem = object(TSwitchItem)      MultiStr : array[TSwitchMode] of PunsortedStringCollection;      constructor Init(const n,p:string;AID: TParamID);      function  NeedParam:boolean;virtual;      function  ParamValue(nr:sw_integer):string;virtual;      function  ParamCount:sw_integer;virtual;      procedure Reset;virtual;      destructor done;virtual;    end;    PLongintItem = ^TLongintItem;    TLongintItem = object(TSwitchItem)      Val : array[TSwitchMode] of longint;      constructor Init(const n,p:string; AID: TParamID);      function  NeedParam:boolean;virtual;      function  ParamValue(nr:sw_integer):string;virtual;      function  GetNumberStr(SM: TSwitchMode): string; virtual;      procedure Reset;virtual;    end;    PSwitches = ^TSwitches;    TSwitches = object      constructor Init(ch:char);      constructor InitSelect(ch:char);      destructor  Done;      { general items }      function  ItemCount:integer;      function  ItemName(index:integer):string;      function  ItemParam(index:integer):string;      { type specific }      procedure AddSelectItem(const name,param:string; AID: TParamID);      procedure AddDefaultSelect(const name:string);      procedure AddBooleanItem(const name,param:string; AID: TParamID);      procedure AddLongintItem(const name,param:string; AID: TParamID);      procedure AddStringItem(const name,param:string;AID: TParamID;mult,allowspaces:boolean);      procedure AddMultiStringItem(const name,param:string;AID: TParamID);      function  GetCurrSel:integer;      function  GetCurrSelParam : String;      function  GetBooleanItem(index:integer):boolean;      function  GetLongintItem(index:integer):longint;      function  GetStringItem(index:integer):string;      function  GetMultiStringItem(index:integer):PunsortedStringCollection;      function  GetItemTyp(index:integer):TSwitchItemTyp;      procedure SetCurrSel(index:integer);      function  SetCurrSelParam(const s:string) : boolean;      procedure SetBooleanItem(index:integer;b:boolean);      procedure SetLongintItem(index:integer;l:longint);      procedure SetStringItem(index:integer;const s:string);      { read / write to cfgfile which must be open }      procedure WriteItemsCfg;      function  ReadItemsCfg(const s:string):boolean;    private      IsSel  : boolean;      Prefix : char;      SelNr  : array[TSwitchMode] of integer;      Items  : PCollection;    end;const    SwitchesMode : TSwitchMode = om_Normal;    SwitchesModeName : array[TSwitchMode] of string[10]=      ('~N~ormal','~D~ebug','~R~elease');    SwitchesModeStr : array[TSwitchMode] of string[8]=      ('NORMAL','DEBUG','RELEASE');    CustomArg : array[TSwitchMode] of string{$ifndef FPC}[128]{$endif}=      ('','','');var    LibLinkerSwitches,    OtherLinkerSwitches,    DebugInfoSwitches,    LinkAfterSwitches,    ProfileInfoSwitches,    {MemorySizeSwitches, doubled !! }    SyntaxSwitches,    CompilerModeSwitches,    VerboseSwitches,    CodegenSwitches,    OptimizationSwitches,    ProcessorCodeGenerationSwitches,    ProcessorOptimizationSwitches,    AsmReaderSwitches,    AsmInfoSwitches,    AsmOutputSwitches,    TargetSwitches,    ConditionalSwitches,    MemorySwitches,    BrowserSwitches,    DirectorySwitches : PSwitches;{ write/read the Switches to fpc.cfg file }procedure WriteSwitches(const fn:string);procedure ReadSwitches(const fn:string);procedure UpdateAsmOutputSwitches;{ initialize }procedure InitSwitches;procedure SetDefaultSwitches;procedure DoneSwitches;function  GetSourceDirectories : string;procedure GetCompilerOptionLines(C: PUnsortedStringCollection);implementationuses  Dos,  GlobType,  CpuInfo,  FPVars,FPUtils;var  CfgFile : text;{$ifdef useresstrings}resourcestring{$else}const{$endif}      msg_automaticallycreateddontedit = 'Automatically created file, don''t edit.';      { Compiler options }      opt_objectpascal = 'Object pascal support';      opt_clikeoperators = 'C-like operators';      opt_stopafterfirsterror = 'Stop after first error';      opt_allowlabelandgoto = 'Allow LABEL and GOTO';      opt_cplusplusstyledinline = 'Allow inline';      opt_globalcmacros = 'Enable macros';      opt_allowstaticinobjects = 'Allow STATIC in objects';      opt_assertions = 'Include assertion code';      opt_kylix = 'Load Kylix compat. unit';      opt_ansistring = 'Use Ansi Strings';      opt_strictvarstrings = 'Strict var-strings';      opt_extendedsyntax = 'Extended syntax';      opt_allowmmxoperations = 'Allow MMX operations';      opt_mode_freepascal = 'Free Pascal dialect';      opt_mode_objectpascal = 'Object Pascal extension on';      opt_mode_turbopascal = 'Turbo Pascal compatible';      opt_mode_delphi = 'Delphi compatible';      opt_mode_macpascal = 'Macintosh Pascal dialect';      opt_mode_gnupascal = 'GNU Pascal';      { Verbose options }      opt_warnings = '~W~arnings';      opt_notes = 'N~o~tes';      opt_hints = '~H~ints';      opt_generalinfo = 'General ~I~nfo';      opt_usedtriedinfo = '~U~sed,tried info';      opt_all = '~A~ll';      opt_showallprocsonerror = 'Show all ~P~rocedures if error';      { Checking options }      opt_rangechecking = '~R~ange checking';      opt_stackchecking = '~S~tack checking';      opt_iochecking = '~I~/O checking';      opt_overflowchecking = 'Integer ~o~verflow checking';      opt_objmethcallvalid = 'Object ~m~ethod call checking';      { Code generation }      opt_pic = '~P~osition independent code';      opt_smart = 'Create smart~l~inkable units';      { Code options }      //opt_generatefastercode = 'Generate ~f~aster code';      opt_generatesmallercode = 'G~e~nerate smaller code';      opt_useregistervariables = 'Use regis~t~er-variables';      opt_uncertainoptimizations = '~U~ncertain optimizations';      opt_level1optimizations = 'Level ~1~ optimizations';      opt_level2optimizations = 'Level ~2~ optimizations';      opt_level3optimizations = 'Level ~3~ optimizations';      { optimization processor target }      opt_i386486 = 'i~3~86/i486';      opt_pentium = 'P~e~ntium (tm)';      opt_pentiummmx = 'PentiumMM~X~ (tm)';      opt_pentiumpro = '~P~entium2/PentiumM/AMD';      opt_pentiumiv = 'Pentium~4~';      opt_pentiumm = 'Pentium~M~';      opt_m68000 = 'm~6~8000';      opt_m68020 = 'm680~2~0';      { Assembler options }      opt_directassembler = '~D~irect assembler';      opt_defaultassembler = '~D~efault style assembler';      opt_attassembler = '~A~T&T style assembler';      opt_intelassembler = '~I~ntel style assembler';      opt_motassembler = '~M~otorola style assembler';      opt_standardassembler = '~S~tandard style assembler';      opt_listsource = '~L~ist source';      opt_listregisterallocation = 'list ~r~egister allocation';      opt_listtempallocation = 'list ~t~emp allocation';      opt_listnodeallocation = 'list ~n~ode allocation';      opt_useasmpipe = 'use ~p~ipe with assembler';      { Assembler output selection }      opt_usedefaultas = 'Use ~d~efault output';      opt_usegnuas = 'Use ~G~NU as';      { I386 assembler output selection }      opt_usenasmcoff = 'Use ~N~ASM coff';      opt_usenasmwin32 = 'Use NASM ~w~in32';      opt_usenasmwdosx= 'Use ~N~ASM w~d~osx';      opt_usenasmelf = 'Use NASM el~f~';      opt_usenasmbeos = 'Use NASM ~b~eos';      opt_usenasmobj = 'Use NASM ~o~bj';      opt_usemasm = 'Use ~M~ASM';      opt_usetasm = 'Use ~T~ASM';      opt_usewasm = 'Use ~W~ASM';      opt_usecoff = 'Use internal ~c~off';      opt_usepecoff = 'Use internal ~p~ecoff';      opt_usepecoffwdosx = 'Use internal pewdos~x~';      opt_useelf= 'Use internal ~e~lf';      { Browser options }      opt_nobrowser = 'N~o~ browser';      opt_globalonlybrowser = 'Only Glob~a~l browser';      opt_localglobalbrowser = '~L~ocal and global browser';      { Conditional defines }      opt_conditionaldefines = 'Conditio~n~al defines';      { Memory sizes }      opt_stacksize = '~S~tack size';      opt_heapsize = '~H~eap size';      { Directory options }      opt_unitdirectories = '~U~nit directories';      opt_includedirectories = '~I~nclude directories';      opt_librarydirectories = '~L~ibrary directories';      opt_objectdirectories = '~O~bject directories';      opt_exeppudirectories = '~E~XE output directory';      opt_ppuoutputdirectory = '~P~PU output directory';      opt_cross_tools_directory = '~C~ross tools directory';      opt_dynamic_linker = '~D~ynamic linker path';      { Library options }      opt_librariesdefault = '~T~arget default';      opt_dynamiclibraries = 'Link to ~D~ynamic libraries';      opt_staticlibraries = 'Link to ~S~tatic libraries';      opt_smartlibraries = 'Link to S~m~art libraries';      opt_forcestaticlibs = 'Only link to st~a~tic libraries';      { Symbol info options }      opt_stripalldebugsymbols = '~S~trip all debug symbols from executable';      opt_nogendebugsymbolinfo = 'Skip ~d~ebug information generation';      opt_gendebugsymbolinfo = 'Generate ~d~ebug symbol information';      opt_gensymbolandbacktraceinfo = 'Generate also backtrace ~l~ine information';      opt_valgrindinfo = 'Generate ~v~algrind compatible debug info';      { Link after options }      opt_linkafter = 'Call ~l~inker after';      { Profiling options }      opt_noprofileinfo = '~N~o profile information';      opt_gprofinfo = 'Generate profile code for g~p~rof';{*****************************************************************************            TSwitchItem*****************************************************************************}constructor TSwitchItem.Init(const n,p:string; AID: TParamID);begin  Inherited Init;  Name:=n;  Param:=p;  ParamID:=AID;end;function TSwitchItem.NeedParam:boolean;begin  NeedParam:=false;end;function TSwitchItem.ParamValue(nr:sw_integer):string;begin  ParamValue:='';end;function TSwitchItem.ParamValueBool(SM: TSwitchMode):boolean;begin  Abstract;  ParamValueBool:=false;end;function TSwitchItem.ParamCount:sw_integer;begin  ParamCount:=1;end;function TSwitchItem.GetSwitchStr(SM: TSwitchMode): string;begin  Abstract;  GetSwitchStr:='';end;function TSwitchItem.GetNumberStr(SM: TSwitchMode): string;begin  Abstract;  GetNumberStr:='';end;function TSwitchItem.GetOptionStr(SM: TSwitchMode): string;begin  Abstract;  GetOptionStr:='';end;procedure TSwitchItem.Reset;beginend;{*****************************************************************************            TSelectItem*****************************************************************************}constructor TSelectItem.Init(const n,p:string; AID: TParamID);begin  Inherited Init(n,p,AID);  Typ:=ot_Select;  IsDefault:=false;end;constructor TSelectItem.InitDefault(const n:string);begin  Inherited Init(n,'',idNone);  Typ:=ot_Select;  IsDefault:=true;end;{*****************************************************************************                TBooleanItem*****************************************************************************}constructor TBooleanItem.Init(const n,p:string; AID: TParamID);begin  Inherited Init(n,p,AID);  Typ:=ot_Boolean;  Reset;end;function TBooleanItem.NeedParam:boolean;begin  NeedParam:=IsSet[SwitchesMode];end;procedure TBooleanItem.Reset;begin  FillChar(IsSet,sizeof(IsSet),0);end;function TBooleanItem.ParamValueBool(SM: TSwitchMode):boolean;begin  ParamValueBool:=IsSet[SM];end;function TBooleanItem.GetSwitchStr(SM: TSwitchMode): string;begin  GetSwitchStr:=BoolToStr(IsSet[SM],'+','-');end;{*****************************************************************************            TStringItem*****************************************************************************}constructor TStringItem.Init(const n,p:string; AID: TParamID; mult,allowspaces:boolean);begin  Inherited Init(n,p,AID);  Typ:=ot_String;  Multiple:=mult;  SeparateSpaces:=not allowspaces;  Reset;end;function TStringItem.NeedParam:boolean;begin  NeedParam:=(Str[SwitchesMode]<>'');end;function TStringItem.ParamValue(nr:sw_integer):string;begin  ParamValue:=Str[SwitchesMode];end;procedure TStringItem.Reset;begin  FillChar(Str,sizeof(Str),0);end;{*****************************************************************************            TMultiStringItem*****************************************************************************}constructor TMultiStringItem.Init(const n,p:string;AID:TParamID);var i:TSwitchMode;begin  inherited Init(n,p,AID);  typ:=ot_MultiString;  for i:=low(MultiStr) to high(MultiStr) do    new(MultiStr[i],init(5,5));{  Reset;}end;function TMultiStringItem.NeedParam:boolean;begin  NeedParam:=(multistr[SwitchesMode]^.count<>0);end;function TMultiStringItem.ParamValue(nr:sw_integer):string;begin  ParamValue:=MultiStr[SwitchesMode]^.at(nr)^;end;function TMultiStringItem.ParamCount:sw_integer;begin  ParamCount:=Multistr[SwitchesMode]^.count;end;procedure TMultiStringItem.Reset;var i:TSwitchMode;begin  for i:=low(multiStr) to high(multiStr) do    MultiStr[i]^.freeall;end;destructor TmultiStringItem.done;var i:TSwitchMode;begin  for i:=low(MultiStr) to high(MultiStr) do    dispose(MultiStr[i],done);  inherited done;end;{*****************************************************************************                TLongintItem*****************************************************************************}constructor TLongintItem.Init(const n,p:string; AID: TParamID);begin  Inherited Init(n,p,AID);  Typ:=ot_Longint;  Reset;end;function TLongintItem.NeedParam:boolean;begin  NeedParam:=(Val[SwitchesMode]<>0);end;function TLongintItem.ParamValue(nr:sw_integer):string;var  s : string;begin  Str(Val[SwitchesMode],s);  ParamValue:=s;end;procedure TLongintItem.Reset;begin  FillChar(Val,sizeof(Val),0);end;function TLongintItem.GetNumberStr(SM: TSwitchMode): string;begin  GetNumberStr:=IntToStr(Val[SM]);end;{*****************************************************************************               TSwitch*****************************************************************************}constructor TSwitches.Init(ch:char);begin  new(Items,Init(10,5));  Prefix:=ch;  FillChar(SelNr,SizeOf(SelNr),#0);  IsSel:=false;end;constructor TSwitches.InitSelect(ch:char);begin  new(Items,Init(10,5));  Prefix:=ch;  FillChar(SelNr,SizeOf(SelNr),#0);  IsSel:=true;end;destructor  TSwitches.Done;begin  dispose(Items,Done);end;procedure TSwitches.AddSelectItem(const name,param:string; AID: TParamID);begin  Items^.Insert(New(PSelectItem,Init(name,Param,AID)));end;procedure TSwitches.AddDefaultSelect(const name:string);begin  Items^.Insert(New(PSelectItem,InitDefault(name)));end;procedure TSwitches.AddBooleanItem(const name,param:string; AID: TParamID);begin  Items^.Insert(New(PBooleanItem,Init(name,Param,AID)));end;procedure TSwitches.AddLongintItem(const name,param:string; AID: TParamID);begin  Items^.Insert(New(PLongintItem,Init(name,Param,AID)));end;procedure TSwitches.AddStringItem(const name,param:string;AID:TParamID;mult,allowspaces:boolean);begin  Items^.Insert(New(PStringItem,Init(name,Param,AID,mult,allowspaces)));end;procedure TSwitches.AddMultiStringItem(const name,param:string;AID:TParamID);begin  Items^.Insert(New(PMultiStringItem,Init(name,Param,AID)));end;function TSwitches.ItemCount:integer;begin  ItemCount:=Items^.Count;end;function TSwitches.ItemName(index:integer):string;var  P : PSwitchItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) then   ItemName:=P^.Name  else   ItemName:='';end;function TSwitches.ItemParam(index:integer):string;var  P : PSwitchItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) then   ItemParam:='-'+Prefix+P^.Param  else   ItemParam:='';end;function TSwitches.GetBooleanItem(index:integer):boolean;var  P : PBooleanItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_boolean) then   GetBooleanItem:=P^.IsSet[SwitchesMode]  else   GetBooleanItem:=false;end;function TSwitches.GetLongintItem(index:integer):longint;var  P : PLongintItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_longint) then   GetLongintItem:=P^.Val[SwitchesMode]  else   GetLongintItem:=0;end;function TSwitches.GetStringItem(index:integer):string;var  P : PStringItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_string) then   GetStringItem:=P^.Str[SwitchesMode]  else   GetStringItem:='';end;function TSwitches.GetMultiStringItem(index:integer):PUnsortedStringCollection;var p:PMultiStringItem;begin  if index<ItemCount then    p:=Items^.at(Index)  else    p:=nil;  if (p<>nil) and (p^.typ=ot_multistring) then    GetMultiStringItem:=p^.MultiStr[SwitchesMode]  else    GetMultiStringItem:=nil;end;function TSwitches.GetItemTyp(index:integer):TSwitchItemTyp;var p:PSwitchItem;begin  assert(index<itemcount);  GetItemTyp:=PSwitchItem(items^.at(index))^.typ;end;procedure TSwitches.SetBooleanItem(index:integer;b:boolean);var  P : PBooleanItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_boolean) then   P^.IsSet[SwitchesMode]:=b;end;procedure TSwitches.SetLongintItem(index:integer;l:longint);var  P : PLongintItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_longint) then   P^.Val[SwitchesMode]:=l;end;procedure TSwitches.SetStringItem(index:integer;const s:string);var  P : PStringItem;begin  if index<ItemCount then    P:=Items^.At(Index)  else    P:=nil;  if assigned(P) and (P^.Typ=ot_string) then   P^.Str[SwitchesMode]:=s;end;function TSwitches.GetCurrSel:integer;begin  if IsSel then   GetCurrSel:=SelNr[SwitchesMode]  else   GetCurrSel:=-1;end;function  TSwitches.GetCurrSelParam : String;begin  if IsSel then    GetCurrSelParam:=PSwitchItem(Items^.At(SelNr[SwitchesMode]))^.Param  else    GetCurrSelParam:='';end;procedure TSwitches.SetCurrSel(index:integer);begin  if index<ItemCount then   SelNr[SwitchesMode]:=index;end;function  TSwitches.SetCurrSelParam(const s : String) : boolean;  function checkitem(P:PSwitchItem):boolean;  begin    { empty items are not equivalent to others !! }    CheckItem:=((S='') and (P^.Param='')) or               ((Length(S)>0) and (P^.Param=s));  end;var  FoundP : PSwitchItem;begin  FoundP:=Items^.FirstThat(@CheckItem);  if Assigned(FoundP) then    begin      SetCurrSelParam:=true;      SelNr[SwitchesMode]:=Items^.IndexOf(FoundP);    end  else    SetCurrSelParam:=false;end;procedure TSwitches.WriteItemsCfg;var  Pref : char;  procedure writeitem(P:PSwitchItem);  var    s,s1 : string;    i,j : integer;  begin    if P^.NeedParam then     begin       if (P^.Typ=ot_string) and (PStringItem(P)^.Multiple) then         begin           s:=PStringItem(P)^.Str[SwitchesMode];           repeat             i:=pos(';',s);             if PStringItem(P)^.SeparateSpaces then               j:=pos(' ',s)             else               j:=0;             if i=0 then              i:=256;             if (j>0) and (j<i) then               i:=j;             s1:=Copy(s,1,i-1);             if s1<>'' then              writeln(CfgFile,' -'+Pref+P^.Param+s1);             Delete(s,1,i);           until s='';         end       else         if P^.Param<>'/' then           for i:=0 to p^.ParamCount-1 do             Writeln(CfgFile,' -'+Pref+P^.Param+P^.ParamValue(i));     end;  end;var  P : PSelectItem;begin  Pref:=Prefix;  if IsSel then    begin      { can be empty for some targets }      If Items^.count>0 then        begin          P:=Items^.At(SelNr[SwitchesMode]);          if not P^.IsDefault then            writeln(CfgFile,' '+ItemParam(SelNr[SwitchesMode]));        end;    end  else    Items^.ForEach(@writeitem);end;procedure WriteCustom;var  s : string;  i : longint;begin  s:=CustomArg[SwitchesMode];  While s<>'' do    begin       i:=pos(' ',s);       if i=0 then i:=256;       writeln(CfgFile,' '+Copy(s,1,i-1));       if i=256 then         s:=''       else         s:=copy(s,i+1,255);    end;end;function TSwitches.ReadItemsCfg(const s:string):boolean;  function checkitem(P:PSwitchItem):boolean;  begin    { empty items are not equivalent to others !! }    { but -dGDB didn't work because of this PM }    CheckItem:=((P^.Param='') and ((S='') or (P^.typ in [ot_Boolean,ot_String]))) or               ((Length(P^.Param)>0) and (upcase(P^.Param)=upcase(S)) and                not (P^.typ in [ot_Boolean,ot_String])) or               ((Length(P^.Param)>0) and (P^.typ<>ot_Select) and                (P^.Param=Copy(s,1,length(P^.Param))));  end;var  FoundP : PSwitchItem;  code : integer;begin  FoundP:=Items^.FirstThat(@checkitem);  if assigned(FoundP) then   begin     case FoundP^.Typ of      ot_Select  : SelNr[SwitchesMode]:=Items^.IndexOf(FoundP);      ot_Boolean : PBooleanItem(FoundP)^.IsSet[SwitchesMode]:=true;      ot_String  : begin           if (PStringItem(FoundP)^.Multiple) and (PStringItem(FoundP)^.Str[SwitchesMode]<>'') then            PStringItem(FoundP)^.Str[SwitchesMode]:=PStringItem(FoundP)^.Str[SwitchesMode]+';'+              Copy(s,length(FoundP^.Param)+1,255)           else            PStringItem(FoundP)^.Str[SwitchesMode]:=Copy(s,length(FoundP^.Param)+1,255);         end;      ot_MultiString :        PMultiStringItem(foundP)^.MultiStr[SwitchesMode]^.insert(newstr(copy(s,length(foundP^.param)+1,255)));      ot_Longint : Val(Copy(s,length(FoundP^.Param)+1,255),PLongintItem(FoundP)^.Val[SwitchesMode],code);     end;     ReadItemsCfg:=true;   end  else   ReadItemsCfg:=false;end;{*****************************************************************************             Read / Write*****************************************************************************}procedure WriteSwitches(const fn:string);var  OldSwitchesMode, SWM: TSwitchMode;begin{ create the switches }  assign(CfgFile,fn);  {$I-}   rewrite(CfgFile);  {$I+}  if ioresult<>0 then   exit;  writeln(CfgFile,'# '+msg_automaticallycreateddontedit);  OldSwitchesMode:=SwitchesMode;  for SWM:=low(TSwitchMode) to high(TSwitchMode) do   begin     SwitchesMode := SWM;     Writeln(CfgFile,'#IFDEF '+SwitchesModeStr[SwitchesMode]);     TargetSwitches^.WriteItemsCfg;     CompilerModeSwitches^.WriteItemsCfg;     VerboseSwitches^.WriteItemsCfg;     SyntaxSwitches^.WriteItemsCfg;     CodegenSwitches^.WriteItemsCfg;     OptimizationSwitches^.WriteItemsCfg;     ProcessorCodeGenerationSwitches^.WriteItemsCfg;     ProcessorOptimizationSwitches^.WriteItemsCfg;     AsmReaderSwitches^.WriteItemsCfg;     AsmInfoSwitches^.WriteItemsCfg;     AsmOutputSwitches^.WriteItemsCfg;     DirectorySwitches^.WriteItemsCfg;     MemorySwitches^.WriteItemsCfg;     ConditionalSwitches^.WriteItemsCfg;     LibLinkerSwitches^.WriteItemsCfg;     OtherLinkerSwitches^.WriteItemsCfg;     DebugInfoSwitches^.WriteItemsCfg;     ProfileInfoSwitches^.WriteItemsCfg;     LinkAfterSwitches^.WriteItemsCfg;     BrowserSwitches^.WriteItemsCfg;     {MemorySizeSwitches^.WriteItemsCfg;}     WriteCustom;     Writeln(CfgFile,'#ENDIF');     Writeln(CfgFile,'');   end;  close(CfgFile);  SwitchesMode:=OldSwitchesMode;end;procedure ReadSwitches(const fn:string);var  c : char;  s : string;  res : boolean;  OldSwitchesMode,i : TSwitchMode;begin  assign(CfgFile,fn);  {$I-}   reset(CfgFile);  {$I+}  if ioresult<>0 then   begin     SetDefaultSwitches;     exit;   end;  OldSwitchesMode:=SwitchesMode;  SwitchesMode:=om_Normal;  while not eof(CfgFile) do   begin     readln(CfgFile,s);     s:=LTrim(s);     if (length(s)>=2) and (s[1]='-') then      begin      c:=s[2];      res:=false;      Delete(s,1,2);      case c of       'a' : res:=AsmInfoSwitches^.ReadItemsCfg(s);       'A' : res:=AsmOutputSwitches^.ReadItemsCfg(s);       'b' : res:=BrowserSwitches^.ReadItemsCfg(s);       'C' : begin               res:=CodegenSwitches^.ReadItemsCfg(s);               if not res then                 res:=MemorySwitches^.ReadItemsCfg(s);               if not res then                 res:=ProcessorCodeGenerationSwitches^.ReadItemsCfg(s);             end;       'd' : res:=ConditionalSwitches^.ReadItemsCfg(s);       'F' : res:=DirectorySwitches^.ReadItemsCfg(s);       'g' : res:=DebugInfoSwitches^.ReadItemsCfg(s);       'O' : begin               res:=OptimizationSwitches^.ReadItemsCfg(s);               if not res then                 res:=ProcessorOptimizationSwitches^.ReadItemsCfg(s);             end;       'M' : res:=CompilerModeSwitches^.ReadItemsCfg(s);       'p' : res:=ProfileInfoSwitches^.ReadItemsCfg(s);       's' : res:=LinkAfterSwitches^.ReadItemsCfg(s);       'R' : res:=AsmReaderSwitches^.ReadItemsCfg(s);       'S' : res:=SyntaxSwitches^.ReadItemsCfg(s);       'T' : res:=TargetSwitches^.ReadItemsCfg(s);       'v' : res:=VerboseSwitches^.ReadItemsCfg(s);       'X' : begin               res:=LibLinkerSwitches^.ReadItemsCfg(s);               if not res then                 res:=OtherLinkerSwitches^.ReadItemsCfg(s);             end;       end;      { keep all others as a string }      if not res then       CustomArg[SwitchesMode]:=CustomArg[SwitchesMode]+' -'+c+s;      end     else      if (Copy(s,1,7)='#IFDEF ') then       begin         Delete(s,1,7);         for i:=low(TSwitchMode) to high(TSwitchMode) do         if s=SwitchesModeStr[i] then           begin             SwitchesMode:=i;             break;           end;       end      else;   end;  close(CfgFile);  SwitchesMode:=OldSwitchesMode;end;function  GetSourceDirectories : string;var  P : PStringItem;  S : String;  c : char;  function checkitem(P:PSwitchItem):boolean;  begin    CheckItem:=(P^.Typ=ot_string) and (P^.Param=c);  end;begin  GetSourceDirectories:='';  c:='u';  P:=DirectorySwitches^.Items^.FirstThat(@CheckItem);  S:='';  if assigned(P) then    S:=P^.Str[SwitchesMode];  c:='i';  P:=DirectorySwitches^.Items^.FirstThat(@CheckItem);  if assigned(P) then    S:=P^.Str[SwitchesMode]+';'+S;  if S='' then    GetSourceDirectories:=SourceDirs+';'  else    GetSourceDirectories:=SourceDirs+';'+S+';';end;{*****************************************************************************             AsmOutputInitialize*****************************************************************************}procedure UpdateAsmOutputSwitches;var  ta : tasm;  st : string;begin  if assigned(AsmOutputSwitches) then    dispose(AsmOutputSwitches,Done);  New(AsmOutputSwitches,InitSelect('A'));  with AsmOutputSwitches^ do   begin     AddDefaultSelect(opt_usedefaultas);     for ta:=low(tasm) to high(tasm) do       if assigned(asminfos[ta]) and         ((target_info.system in asminfos[ta]^.supported_targets) or         (system_any in asminfos[ta]^.supported_targets)) then         begin           st:='Asm '+asminfos[ta]^.idtxt;           if asminfos[ta]^.idtxt='AS' then             st:=opt_usegnuas;{$ifdef I386}           if asminfos[ta]^.idtxt='NASMCOFF' then             st:=opt_usenasmcoff;           if asminfos[ta]^.idtxt='NASMOBJ' then             st:=opt_usenasmobj;           if asminfos[ta]^.idtxt='NASMWIN32' then             st:=opt_usenasmwin32;           if asminfos[ta]^.idtxt='NASMWDOSX' then             st:=opt_usenasmwdosx;           if asminfos[ta]^.idtxt='NASMELF' then             st:=opt_usenasmelf;           if asminfos[ta]^.idtxt='NASMBEOS' then             st:=opt_usenasmbeos;           if asminfos[ta]^.idtxt='MASM' then             st:=opt_usemasm;           if asminfos[ta]^.idtxt='TASM' then             st:=opt_usetasm;           if asminfos[ta]^.idtxt='WASM' then             st:=opt_usewasm;           if asminfos[ta]^.idtxt='COFF' then             st:=opt_usecoff;           if asminfos[ta]^.idtxt='PECOFF' then             st:=opt_usepecoff;           if asminfos[ta]^.idtxt='PEWDOSX' then             st:=opt_usepecoffwdosx;           if asminfos[ta]^.idtxt='ELF' then             st:=opt_useelf;{$endif I386}           AddSelectItem(st,asminfos[ta]^.idtxt,idNone);         end;   end;end;{*****************************************************************************             Initialize*****************************************************************************}procedure InitSwitches;var  t : tsystem;  cpu : tcputype;  st : string;begin  New(SyntaxSwitches,Init('S'));  with SyntaxSwitches^ do   begin//     AddBooleanItem(opt_objectpascal,'2',idNone);     AddBooleanItem(opt_stopafterfirsterror,'e',idNone);     AddBooleanItem(opt_allowlabelandgoto,'g',idNone);     AddBooleanItem(opt_globalcmacros,'m',idNone);     AddBooleanItem(opt_cplusplusstyledinline,'i',idNone);//     AddBooleanItem(opt_tp7compatibility,'o',idNone);//     AddBooleanItem(opt_delphicompatibility,'d',idNone);     AddBooleanItem(opt_assertions,'a',idNone);     AddBooleanItem(opt_ansistring,'h',idAnsiString);     AddBooleanItem(opt_kylix,'k',idNone);     AddBooleanItem(opt_allowstaticinobjects,'s',idNone);     AddBooleanItem(opt_clikeoperators,'c',idNone);     { Useless as they are not passed to the compiler PM     AddBooleanItem(opt_strictvarstrings,'/',idStrictVarStrings);     AddBooleanItem(opt_extendedsyntax,'/',idExtendedSyntax);     AddBooleanItem(opt_allowmmxoperations,'/',idMMXOps);  }   end;  New(CompilerModeSwitches,InitSelect('M'));  with CompilerModeSwitches^ do    begin       AddSelectItem(opt_mode_freepascal,'fpc',idNone);       AddSelectItem(opt_mode_objectpascal,'objfpc',idNone);       AddSelectItem(opt_mode_turbopascal,'tp',idNone);       AddSelectItem(opt_mode_delphi,'delphi',idNone);       AddSelectItem(opt_mode_macpascal,'macpascal',idNone);{      GNU Pascal mode doesn't do much, better disable it       AddSelectItem(opt_mode_gnupascal,'gpc',idNone);}    end;  New(VerboseSwitches,Init('v'));  with VerboseSwitches^ do   begin     AddBooleanItem(opt_warnings,'w',idNone);     AddBooleanItem(opt_notes,'n',idNone);     AddBooleanItem(opt_hints,'h',idNone);     AddBooleanItem(opt_generalinfo,'i',idNone);     AddBooleanItem(opt_usedtriedinfo,'ut',idNone);     AddBooleanItem(opt_all,'a',idNone);     AddBooleanItem(opt_showallprocsonerror,'b',idNone);   end;  New(CodegenSwitches,Init('C'));  with CodegenSwitches^ do   begin     AddBooleanItem(opt_rangechecking,'r',idRangeChecks);     AddBooleanItem(opt_stackchecking,'t',idStackChecks);     AddBooleanItem(opt_iochecking,'i',idIOChecks);     AddBooleanItem(opt_overflowchecking,'o',idOverflowChecks);     AddBooleanItem(opt_objmethcallvalid,'R',idObjMethCallChecks);     AddBooleanItem(opt_pic,'g',idNone);     AddBooleanItem(opt_smart,'X',idNone);   end;  New(OptimizationSwitches,Init('O'));  with OptimizationSwitches^ do   begin     AddBooleanItem(opt_generatesmallercode,'s',idNone);{$ifdef I386}     AddBooleanItem(opt_useregistervariables,'oregvar',idNone);     AddBooleanItem(opt_uncertainoptimizations,'ouncertain',idNone);     AddBooleanItem(opt_level1optimizations,'1',idNone);     AddBooleanItem(opt_level2optimizations,'2',idNone);     AddBooleanItem(opt_level3optimizations,'3',idNone);{$else not I386} {$ifdef m68k}     AddBooleanItem(opt_level1optimizations,'a',idNone);     AddBooleanItem(opt_useregistervariables,'x',idNone); {$endif m68k}{$endif I386}   end;  New(ProcessorOptimizationSwitches,InitSelect('O'));  with ProcessorOptimizationSwitches^ do   begin     for cpu:=low(tcputype) to high(tcputype) do       begin         st:=cputypestr[cpu];{$ifdef I386}         if st='386' then           st:=opt_i386486;         if st='PENTIUM' then           st:=opt_pentium;         if st='PENTIUM2' then           st:=opt_pentiummmx;         if st='PENTIUM3' then           st:=opt_pentiumpro;         if st='PENTIUM4' then           st:=opt_pentiumiv;         if st='PENTIUMM' then           st:=opt_pentiumM;{$endif not I386}{$ifdef m68k}         if st='68000' then           st:=opt_m68000;         if st='68020' then           st:=opt_m68020;{$endif m68k}         if st<>'' then           AddSelectItem(st,'p'+cputypestr[cpu],idNone);       end;   end;  New(ProcessorCodeGenerationSwitches,InitSelect('C'));  with ProcessorCodeGenerationSwitches^ do   begin     for cpu:=low(tcputype) to high(tcputype) do       begin         st:=cputypestr[cpu];{$ifdef I386}         if st='386' then           st:=opt_i386486;         if st='PENTIUM' then           st:=opt_pentium;         if st='PENTIUM2' then           st:=opt_pentiummmx;         if st='PENTIUM3' then           st:=opt_pentiumpro;         if st='PENTIUM4' then           st:=opt_pentiumiv;         if st='PENTIUMM' then           st:=opt_pentiumM;{$endif not I386}{$ifdef m68k}         if st='68000' then           st:=opt_m68000;         if st='68020' then           st:=opt_m68020;{$endif m68k}         { we use the string twice so kill duplicate highlights }         while pos('~',st)<>0 do           delete(st,pos('~',st),1);         if st<>'' then           AddSelectItem(st,'p'+cputypestr[cpu],idNone);       end;   end;  New(TargetSwitches,InitSelect('T'));  with TargetSwitches^ do   begin     { better, we've a correct target list without "tilded" names instead a wrong one }     for t:=low(tsystem) to high(tsystem) do       if assigned(targetinfos[t]) then         AddSelectItem(targetinfos[t]^.name,targetinfos[t]^.shortname,idNone);   end;  New(AsmReaderSwitches,InitSelect('R'));  with AsmReaderSwitches^ do   begin{$ifdef I386}     AddSelectItem(opt_defaultassembler,'default',idNone);{     AddSelectItem(opt_directassembler,'direct',idAsmDirect);}     AddSelectItem(opt_attassembler,'att',idAsmATT);     AddSelectItem(opt_intelassembler,'intel',idAsmIntel);{$endif I386}{$ifdef M68K}     AddSelectItem(opt_defaultassembler,'default',idNone);     //AddSelectItem(opt_standardassembler,'standard',idAsmStandard);     AddSelectItem(opt_motassembler,'motorola',idAsmMot);{$endif M68K}   end;  New(AsmInfoSwitches,Init('a'));  with AsmInfoSwitches^ do   begin     AddBooleanItem(opt_listsource,'l',idNone);     AddBooleanItem(opt_listregisterallocation,'r',idNone);     AddBooleanItem(opt_listtempallocation,'t',idNone);     AddBooleanItem(opt_listnodeallocation,'n',idNone);     AddBooleanItem(opt_useasmpipe,'p',idNone);   end;  UpdateAsmOutputSwitches;  New(BrowserSwitches,InitSelect('b'));  with BrowserSwitches^ do   begin     AddSelectItem(opt_nobrowser,'-',idSymInfNone);     AddSelectItem(opt_globalonlybrowser,'+',idSymInfGlobalOnly);     AddSelectItem(opt_localglobalbrowser,'l',idSymInfGlobalLocal);   end;  New(ConditionalSwitches,Init('d'));  with ConditionalSwitches^ do   begin     AddStringItem(opt_conditionaldefines,'',idNone,true,false);   end;  New(MemorySwitches,Init('C'));  with MemorySwitches^ do   begin     AddLongintItem(opt_stacksize,'s',idStackSize);     AddLongintItem(opt_heapsize,'h',idHeapSize);   end;  New(DirectorySwitches,Init('F'));  with DirectorySwitches^ do   begin     AddMultiStringItem(opt_unitdirectories,'u',idNone);     AddMultiStringItem(opt_includedirectories,'i',idNone);     AddMultiStringItem(opt_librarydirectories,'l',idNone);     AddMultiStringItem(opt_objectdirectories,'o',idNone);     AddStringItem(opt_exeppudirectories,'E',idNone,true,true);     AddStringItem(opt_ppuoutputdirectory,'U',idNone,true,true);     AddStringItem(opt_cross_tools_directory,'D',idNone,true,true);     AddStringItem(opt_dynamic_linker,'L',idNone,false,false);   end;  New(LibLinkerSwitches,InitSelect('X'));  with LibLinkerSwitches^ do   begin     AddDefaultSelect(opt_librariesdefault);     AddSelectItem(opt_dynamiclibraries,'D',idNone);     AddSelectItem(opt_staticlibraries,'S',idNone);     AddSelectItem(opt_smartlibraries,'X',idNone);   end;  New(OtherLinkerSwitches,Init('X'));  with OtherLinkerSwitches^ do   begin     AddBooleanItem(opt_stripalldebugsymbols,'s',idNone);     AddBooleanItem(opt_forcestaticlibs,'t',idNone);   end;  New(DebugInfoSwitches,InitSelect('g'));  with DebugInfoSwitches^ do   begin     AddSelectItem(opt_nogendebugsymbolinfo,'-',idNone);     AddSelectItem(opt_gendebugsymbolinfo,'',idNone);     AddSelectItem(opt_gensymbolandbacktraceinfo,'l',idNone);     AddSelectItem(opt_valgrindinfo,'v',idNone);     { AddSelectItem('Generate ~d~bx symbol information','d');       does not work anyhow (PM) }   end;  New(LinkAfterSwitches,Init('s'));  LinkAfterSwitches^.AddBooleanItem(opt_linkafter,'',idNone);  New(ProfileInfoSwitches,InitSelect('p'));  with ProfileInfoSwitches^ do   begin     AddSelectItem(opt_noprofileinfo,'-',idNone);     AddSelectItem(opt_gprofinfo,'g',idNone);   end;  {New(MemorySizeSwitches,Init('C'));  with MemorySizeSwitches^ do   begin     AddLongIntItem('~S~tack size','s');     AddLongIntItem('Local ~h~eap size','h');   end;}  SwitchesPath:=LocateFile(SwitchesName);  if SwitchesPath='' then    SwitchesPath:=SwitchesName;  SwitchesPath:=FExpand(SwitchesPath);end;procedure SetDefaultSwitches;var   i,OldSwitchesMode : TSwitchMode;begin  { setup some useful defaults }  OldSwitchesMode:=SwitchesMode;  for i:=low(TSwitchMode) to high(TSwitchMode) do    begin       SwitchesMode:=i;       { default is Pentium }       ProcessorOptimizationSwitches^.SetCurrSel(1);       { AT&T reader }       AsmReaderSwitches^.SetCurrSel(1);       { FPC mode}       CompilerModeSwitches^.SetCurrSel(0);(* Use platform defaults for memory switches. *)       { 128k stack }{       MemorySwitches^.SetLongintItem(0,65536*2);}       MemorySwitches^.SetLongintItem(0,0);       { 2 MB heap }{       MemorySwitches^.SetLongintItem(1,1024*1024*2);}       MemorySwitches^.SetLongintItem(1,0);       { goto/lable allowed }       SyntaxSwitches^.SetBooleanItem(1,true);       { inline allowed }       SyntaxSwitches^.SetBooleanItem(3,true);       { Exe size complaints are louder than speed complaints: Optimize for size by default. }       OptimizationSwitches^.SetBooleanItem(0,true);       case i of          om_debug:            begin               { debugging info on }               DebugInfoSwitches^.SetCurrSel(1);               { range checking }               CodegenSwitches^.SetBooleanItem(0,true);               { io checking }               CodegenSwitches^.SetBooleanItem(2,true);               { overflow checking }               CodegenSwitches^.SetBooleanItem(3,true);               { method call checking }               CodegenSwitches^.SetBooleanItem(4,true);               { assertions on }               SyntaxSwitches^.SetBooleanItem(4,true);            end;          om_normal:            begin               {Register variables.}               OptimizationSwitches^.SetBooleanItem(1,true);               {Level 1 optimizations.}               OptimizationSwitches^.SetBooleanItem(3,true);            end;          om_release:            begin               {Register variables.}               OptimizationSwitches^.SetBooleanItem(1,true);               {Level 2 optimizations.}               OptimizationSwitches^.SetBooleanItem(4,true);               {Smart linking.}               LibLinkerSwitches^.SetCurrSel(3);               CodegenSwitches^.SetBooleanItem(6,true);               {Strip debug info}               OtherLinkerSwitches^.SetBooleanItem(0,true);            end;       end;       { set appriopriate default target }       TargetSwitches^.SetCurrSelParam(target_info.shortname);    end;  SwitchesMode:=OldSwitchesMode;end;procedure DoneSwitches;begin  dispose(SyntaxSwitches,Done);  dispose(CompilerModeSwitches,Done);  dispose(VerboseSwitches,Done);  dispose(CodegenSwitches,Done);  dispose(OptimizationSwitches,Done);  dispose(ProcessorOptimizationSwitches,Done);  dispose(ProcessorCodeGenerationSwitches,Done);  dispose(BrowserSwitches,Done);  dispose(TargetSwitches,Done);  dispose(AsmReaderSwitches,Done);  dispose(AsmOutputSwitches,Done);  dispose(AsmInfoSwitches,Done);  dispose(ConditionalSwitches,Done);  dispose(MemorySwitches,Done);  {dispose(MemorySizeSwitches,Done);}  dispose(DirectorySwitches,Done);  dispose(DebugInfoSwitches,Done);  dispose(LibLinkerSwitches,Done);  dispose(LinkAfterSwitches,Done);  dispose(OtherLinkerSwitches,Done);  dispose(ProfileInfoSwitches,Done);end;procedure GetCompilerOptionLines(C: PUnsortedStringCollection);procedure AddLine(const S: string);begin  C^.Insert(NewStr(S));end;procedure ConstructSwitchModeDirectives(SM: TSwitchMode; const IfDefSym: string);var SwitchParams: PStringCollection;    MiscParams  : PStringCollection;procedure AddSwitch(const S: string);begin  SwitchParams^.Insert(NewStr(S));end;procedure AddParam(const S: string);begin  MiscParams^.Insert(NewStr(S));end;procedure EnumSwitches(P: PSwitches);procedure HandleSwitch(P: PSwitchItem);begin  case P^.ParamID of{    idAlign :}    idRangeChecks    : AddSwitch('R'+P^.GetSwitchStr(SM));    idStackChecks    : AddSwitch('S'+P^.GetSwitchStr(SM));    idIOChecks       : AddSwitch('I'+P^.GetSwitchStr(SM));    idOverflowChecks : AddSwitch('Q'+P^.GetSwitchStr(SM));    idObjMethCallChecks: AddSwitch('OBJECTCHECKS'+P^.GetSwitchStr(SM));{    idAsmDirect      : if P^.GetParamValueBool[SM] then AddParam('ASMMODE DIRECT');    idAsmATT         : if P^.GetParamValueBool[SM] then AddParam('ASMMODE ATT');    idAsmIntel       : if P^.GetParamValueBool[SM] then AddParam('ASMMODE INTEL');    idAsmMot         : if P^.GetParamValueBool[SM] then AddParam('ASMMODE MOTOROLA');    idAsmStandard    : if P^.GetParamValueBool[SM] then AddParam('ASMMODE STANDARD');}{    idSymInfNone     : ;    idSymInfGlobalOnly:;    idSymInfGlobalLocal:if P^.ParamValueBool(SM) then AddSwitch('L+');}{    idStackSize    idHeapSize}    idStrictVarStrings: AddSwitch('V'+P^.GetSwitchStr(SM));    idExtendedSyntax  : AddSwitch('X'+P^.GetSwitchStr(SM));    idMMXOps          : if P^.ParamValueBool(SM) then AddParam('MMX');    idTypedAddress    : AddSwitch('T'+P^.GetSwitchStr(SM));{    idPackRecords    idPackEnum}    idStackFrames     : AddSwitch('W'+P^.GetSwitchStr(SM));    idReferenceInfo   : AddSwitch('Y'+P^.GetSwitchStr(SM));    idDebugInfo       : AddSwitch('D'+P^.GetSwitchStr(SM));    idBoolEval        : AddSwitch('B'+P^.GetSwitchStr(SM));    idAnsiString      : AddSwitch('H'+P^.GetSwitchStr(SM));    idTypeInfo        : AddSwitch('M'+P^.GetSwitchStr(SM));   end;end;begin  P^.Items^.ForEach(@HandleSwitch);end;var I: integer;    S: string;begin  AddLine('{$IFDEF '+IfDefSym+'}');  New(SwitchParams, Init(10,10));  New(MiscParams, Init(10,10));  EnumSwitches(LibLinkerSwitches);  EnumSwitches(OtherLinkerSwitches);  EnumSwitches(DebugInfoSwitches);  EnumSwitches(ProfileInfoSwitches);  EnumSwitches(SyntaxSwitches);  EnumSwitches(CompilerModeSwitches);  EnumSwitches(VerboseSwitches);  EnumSwitches(CodegenSwitches);  EnumSwitches(OptimizationSwitches);  EnumSwitches(ProcessorOptimizationSwitches);  EnumSwitches(ProcessorCodeGenerationSwitches);  EnumSwitches(AsmReaderSwitches);  EnumSwitches(AsmInfoSwitches);  EnumSwitches(AsmOutputSwitches);  EnumSwitches(TargetSwitches);  EnumSwitches(ConditionalSwitches);  EnumSwitches(MemorySwitches);  EnumSwitches(BrowserSwitches);  EnumSwitches(DirectorySwitches);  S:='';  for I:=0 to SwitchParams^.Count-1 do  begin    if I=0 then S:='{$' else S:=S+',';    S:=S+PString(SwitchParams^.At(I))^;  end;  if S<>'' then S:=S+'}';  if S<>'' then AddLine('  '+S);  for I:=0 to MiscParams^.Count-1 do    AddLine('  {$'+PString(MiscParams^.At(I))^+'}');  Dispose(SwitchParams, Done); Dispose(MiscParams, Done);  AddLine('{$ENDIF '+IfDefSym+'}');end;var SM: TSwitchMode;begin  for SM:=Low(TSwitchMode) to High(TSwitchMode) do    ConstructSwitchModeDirectives(SM,SwitchesModeStr[SM]);end;end.
 |