Browse Source

* reinserted

peter 26 years ago
parent
commit
a13afdbb6f
1 changed files with 1626 additions and 0 deletions
  1. 1626 0
      compiler/options.pas

+ 1626 - 0
compiler/options.pas

@@ -0,0 +1,1626 @@
+{
+    $Id$
+    Copyright (c) 1993-98 by the FPC development team
+
+    Reads command line options and config files
+
+    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 options;
+
+interface
+
+uses
+  verbose;
+
+type
+  POption=^TOption;
+  TOption=object
+    FirstPass,
+    NoPressEnter,
+    DoWriteLogo : boolean;
+    FileLevel : longint;
+    Constructor Init;
+    Destructor Done;
+    procedure WriteLogo;
+    procedure WriteInfo;
+    procedure WriteHelpPages;
+    procedure QuickInfo(const s:string);
+    procedure IllegalPara(const opt:string);
+    function  Unsetbool(const opts:string; pos: Longint):boolean;
+    procedure interpret_proc_specific_options(const opt:string);virtual;
+    procedure interpret_option(const opt :string);
+    procedure Interpret_file(const filename : string);
+    procedure Read_Parameters;
+    procedure parsecmd(cmd:string);
+  end;
+
+procedure read_arguments(cmd:string);
+
+
+implementation
+
+uses
+{$ifdef Delphi}
+  dmisc,
+{$endif Delphi}
+  globtype,version,systems,
+  dos,cobjects,globals,
+  scanner,link,messages
+{$ifdef BrowserLog}
+  ,browlog
+{$endif BrowserLog}
+{$ifdef i386}
+  ,opts386
+{$endif}
+{$ifdef m68k}
+  ,opts68k
+{$endif}
+  ;
+
+const
+  page_size = 24;
+
+var
+  read_configfile,        { read config file, set when a cfgfile is found }
+  target_is_set : boolean;  { do not allow contradictory target settings }
+  asm_is_set  : boolean; { -T also change initoutputformat if not set idrectly }
+  ppccfg,
+  msgfilename,
+  param_file    : string;   { file to compile specified on the commandline }
+
+{****************************************************************************
+                                 Defines
+****************************************************************************}
+
+procedure def_symbol(const s : string);
+begin
+  if s='' then
+   exit;
+  initdefines.concat(new(pstring_item,init(upper(s))));
+end;
+
+
+procedure undef_symbol(const s : string);
+var
+  item,next : pstring_item;
+begin
+  if s='' then
+   exit;
+  item:=pstring_item(initdefines.first);
+  while assigned(item) do
+   begin
+     if (item^.str^=s) then
+      begin
+        next:=pstring_item(item^.next);
+        initdefines.remove(item);
+        dispose(item,done);
+        item:=next;
+      end
+     else
+      if item<>pstring_item(item^.next) then
+       item:=pstring_item(item^.next)
+      else
+       break;
+   end;
+end;
+
+
+function check_symbol(const s:string):boolean;
+var
+  hp : pstring_item;
+begin
+  hp:=pstring_item(initdefines.first);
+  while assigned(hp) do
+   begin
+     if (hp^.str^=s) then
+      begin
+        check_symbol:=true;
+        exit;
+      end;
+     hp:=pstring_item(hp^.next);
+   end;
+  check_symbol:=false;
+end;
+
+procedure MaybeLoadMessageFile;
+begin
+{ Load new message file }
+  if (msgfilename<>'')  then
+    begin
+       if fileexists(msgfilename) then
+         LoadMsgFile(msgfilename);
+       msgfilename:='';
+    end;
+end;
+
+{****************************************************************************
+                                 Toption
+****************************************************************************}
+
+procedure Toption.WriteLogo;
+var
+  i : tmsgconst;
+begin
+  MaybeLoadMessageFile;
+  for i:=option_logo_start to option_logo_end do
+   Message1(i,target_cpu_string);
+end;
+
+
+procedure Toption.WriteInfo;
+var
+  i : tmsgconst;
+begin
+  MaybeLoadMessageFile;
+  for i:=option_info_start to option_info_end do
+   Message(i);
+  Stop;
+end;
+
+
+procedure Toption.WriteHelpPages;
+
+  function PadEnd(s:string;i:longint):string;
+  begin
+    while (length(s)<i) do
+     s:=s+' ';
+    PadEnd:=s;
+  end;
+
+var
+  idx,
+  lastident,
+  j,outline,
+  ident,
+  lines : longint;
+  show  : boolean;
+  opt   : string[32];
+  input,
+  s     : string;
+begin
+  MaybeLoadMessageFile;
+  Message1(option_usage,paramstr(0));
+  lastident:=0;
+  if DoWriteLogo then
+   lines:=3
+  else
+   lines:=1;
+  for idx:=ord(ol_begin) to ord(ol_end) do
+   begin
+   { get a line and reset }
+     s:=msg^.Get(idx);
+     ident:=0;
+     show:=false;
+   { parse options }
+     case s[1] of
+{$ifdef i386}
+      '3',
+{$endif}
+{$ifdef m68k}
+      '6',
+{$endif}
+      '*' : show:=true;
+     end;
+     if show then
+      begin
+        case s[2] of
+{$ifdef TP}
+         't',
+{$endif}
+{$ifdef GDB}
+         'g',
+{$endif}
+{$ifdef linux}
+         'L',
+{$endif}
+{$ifdef os2}
+         'O',
+{$endif}
+         '*' : show:=true;
+        else
+         show:=false;
+        end;
+      end;
+   { now we may show the message or not }
+     if show then
+      begin
+        case s[3] of
+         '0' : begin
+                 ident:=0;
+                 outline:=0;
+               end;
+         '1' : begin
+                 ident:=2;
+                 outline:=7;
+               end;
+         '2' : begin
+                 ident:=11;
+                 outline:=11;
+               end;
+         '3' : begin
+                 ident:=21;
+                 outline:=6;
+               end;
+        end;
+        j:=pos('_',s);
+        opt:=Copy(s,4,j-4);
+        if opt='*' then
+         opt:=''
+        else
+         opt:=PadEnd('-'+opt,outline);
+        if (ident=0) and (lastident<>0) then
+         begin
+           Comment(V_Normal,'');
+           inc(Lines);
+         end;
+      { page full ? }
+        if (lines>=page_size) then
+         begin
+           if not NoPressEnter then
+            begin
+              write('*** press enter ***');
+              readln(input);
+              if upper(input)='Q' then
+               stop;
+            end;
+           lines:=0;
+         end;
+        Comment(V_Normal,PadEnd('',ident)+opt+Copy(s,j+1,255));
+        LastIdent:=Ident;
+        inc(Lines);
+      end;
+   end;
+  stop;
+end;
+
+
+procedure Toption.QuickInfo(const s:string);
+begin
+  Writeln(s);
+  Stop;
+end;
+
+
+procedure Toption.IllegalPara(const opt:string);
+begin
+  Message1(option_illegal_para,opt);
+  Message(option_help_pages_para);
+  stop;
+end;
+
+
+function Toption.Unsetbool(const opts:string; pos: Longint):boolean;
+{ checks if the character after pos in Opts is a + or a - and returns resp.
+  false or true. If it is another character (or none), it also returns false }
+begin
+  UnsetBool := (Length(Opts) > Pos) And (Opts[Succ(Pos)] = '-');
+end;
+
+
+procedure TOption.interpret_proc_specific_options(const opt:string);
+begin
+end;
+
+
+procedure TOption.interpret_option(const opt:string);
+var
+  code : integer;
+  c    : char;
+  more : string;
+  j,l  : longint;
+  d    : DirStr;
+  e    : ExtStr;
+begin
+  if opt='' then
+   exit;
+  case opt[1] of
+ '-' : begin
+         more:=Copy(opt,3,255);
+         case opt[2] of
+              '!' : initlocalswitches:=initlocalswitches+[cs_ansistrings];
+              '?' : WriteHelpPages;
+              'a' : begin
+                      initglobalswitches:=initglobalswitches+[cs_asm_leave];
+                      for j:=1 to length(more) do
+                       case more[j] of
+                        'l' : initglobalswitches:=initglobalswitches+[cs_asm_source];
+                        'r' : initglobalswitches:=initglobalswitches+[cs_asm_regalloc];
+                        't' : initglobalswitches:=initglobalswitches+[cs_asm_tempalloc];
+                        '-' : initglobalswitches:=initglobalswitches-[cs_asm_leave,cs_asm_source,cs_asm_regalloc];
+                       else
+                         IllegalPara(opt);
+                       end;
+                    end;
+              'A' : begin
+                      if set_string_asm(More) then
+                       begin
+                         initoutputformat:=target_asm.id;
+                         asm_is_set:=true;
+                       end
+                      else
+                       IllegalPara(opt);
+                    end;
+              'b' : begin
+{$ifdef BrowserLog}
+                      initglobalswitches:=initglobalswitches+[cs_browser_log];
+{$endif}
+                      if More<>'' then
+                        if More='l' then
+                          initmoduleswitches:=initmoduleswitches+[cs_local_browser]
+                        else if More='-' then
+                          begin
+                            initmoduleswitches:=initmoduleswitches-[cs_browser,cs_local_browser];
+{$ifdef BrowserLog}
+                            initglobalswitches:=initglobalswitches-[cs_browser_log];
+{$endif}
+                          end
+                        else if More<>'+' then
+{$ifdef BrowserLog}
+                          browserlog.elements_to_list^.insert(more);
+{$else}
+                          IllegalPara(opt);
+{$endif}
+                    end;
+              'B' : if more='' then
+                      do_build:=true
+                    else
+                      if more = '-' then
+                        do_build := False
+                      else
+                        IllegalPara(opt);
+              'C' : begin
+                      j := 1;
+                      while j <= length(more) Do
+                        Begin
+                          case more[j] of
+                            'D' :
+                              begin
+                                If UnsetBool(More, j) then
+                                  Begin
+                                    initmoduleswitches:=initmoduleswitches-[cs_create_sharedlib];
+                                    inc(j)
+                                  End
+                                Else
+                                  Begin
+                                    if target_info.target in [target_i386_GO32V1,target_i386_GO32V2] then
+                                      begin
+                                        Message(option_no_shared_lib_under_dos);
+                                        initmoduleswitches:=initmoduleswitches+[cs_create_staticlib];
+                                      end
+                                    Else
+                                      Begin
+                                        initmoduleswitches:=initmoduleswitches+[cs_create_sharedlib];
+                                        initmoduleswitches:=initmoduleswitches-[cs_create_staticlib]
+                                      End;
+                                  End;
+                               end;
+                            'h' :
+                               begin
+                                 val(copy(more,j+1,length(more)-j),heapsize,code);
+                                 if (code<>0) or (heapsize>=67107840) or (heapsize<1024) then
+                                  IllegalPara(opt);
+                                 break;
+                               end;
+                            'i' : If UnsetBool(More, j) then
+                                    Begin
+                                      initlocalswitches:=initlocalswitches-[cs_check_io];
+                                      inc(j)
+                                    End
+                                  else initlocalswitches:=initlocalswitches+[cs_check_io];
+                            'n' : If UnsetBool(More, j) then
+                                    Begin
+                                      initglobalswitches:=initglobalswitches-[cs_link_extern];
+                                      inc(j)
+                                    End
+                                  Else initglobalswitches:=initglobalswitches+[cs_link_extern];
+                            'o' : If UnsetBool(More, j) then
+                                    Begin
+                                      initlocalswitches:=initlocalswitches-[cs_check_overflow];
+                                      inc(j)
+                                    End
+                                  Else initlocalswitches:=initlocalswitches+[cs_check_overflow];
+                            'r' : If UnsetBool(More, j) then
+                                    Begin
+                                      initlocalswitches:=initlocalswitches-[cs_check_range];
+                                      inc(j)
+                                    End
+                                  Else initlocalswitches:=initlocalswitches+[cs_check_range];
+                            's' :
+                               begin
+                                 val(copy(more,j+1,length(more)-j),stacksize,code);
+                                 if (code<>0) or (stacksize>=67107840) or (stacksize<1024) then
+                                  IllegalPara(opt);
+                                 break;
+                               end;
+                            't' : If UnsetBool(More, j) then
+                                    Begin
+                                      initlocalswitches:=initlocalswitches-[cs_check_stack];
+                                      inc(j)
+                                    End
+                                  Else initlocalswitches:=initlocalswitches+[cs_check_stack];
+                            'x' : If UnsetBool(More, j) then
+                                    Begin
+                                      initmoduleswitches:=initmoduleswitches-[cs_smartlink];
+                                      inc(j)
+                                    End
+                                  Else initmoduleswitches:=initmoduleswitches+[cs_smartlink];
+                            'S' : If UnsetBool(More, j) then
+                                    Begin
+                                      initmoduleswitches:=initmoduleswitches-[cs_create_staticlib];
+                                      inc(j)
+                                    End
+                                  Else
+                                    Begin
+                                      initmoduleswitches:=initmoduleswitches+[cs_create_staticlib];
+                                      initmoduleswitches:=initmoduleswitches-[cs_create_sharedlib];
+                                    End
+                            else
+                               IllegalPara(opt);
+                          end;
+                          inc(j);
+                        end;
+                    end;
+              'd' : def_symbol(more);
+              'D' : begin
+                      initglobalswitches:=initglobalswitches+[cs_link_deffile];
+                      for j:=1 to length(more) do
+                       case more[j] of
+                        'd' : begin
+                                description:=Copy(more,j+1,255);
+                                break;
+                              end;
+                        'w' : usewindowapi:=true;
+                       else
+                         IllegalPara(opt);
+                       end;
+                    end;
+              'e' : exepath:=FixPath(More,true);
+              { Just used by RHIDE }
+              'E' : if (length(more)=0) or (UnsetBool(More, 0)) then
+                      initglobalswitches:=initglobalswitches+[cs_link_extern]
+                    else
+                      initglobalswitches:=initglobalswitches-[cs_link_extern];
+              'F' : begin
+                      c:=more[1];
+                      Delete(more,1,1);
+                      case c of
+                       'D' : utilsdirectory:=FixPath(More,true);
+                       'e' : SetRedirectFile(More);
+                       'E' : OutputExeDir:=FixPath(More,true);
+                       'i' : AddPathToList(includesearchpath,More,not firstpass);
+                       'g' : Message2(option_obsolete_switch_use_new,'-Fg','-Fl');
+                       'l' : AddPathToList(Linker.LibrarySearchPath,More,not firstpass);
+                       'L' : if More<>'' then
+                              Linker.DynamicLinker:=More
+                             else
+                              IllegalPara(opt);
+                       'o' : AddPathToList(objectsearchpath,More,not firstpass);
+                       'r' : Msgfilename:=More;
+                       'u' : AddPathToList(unitsearchpath,More,not firstpass);
+                       'U' : OutputUnitDir:=FixPath(More,true);
+                      else
+                        IllegalPara(opt);
+                      end;
+                    end;
+              'g' : begin
+                      if UnsetBool(More, 0) then
+                        initmoduleswitches:=initmoduleswitches-[cs_debuginfo]
+                      else
+                       begin
+{$ifdef GDB}
+                         initmoduleswitches:=initmoduleswitches+[cs_debuginfo];
+                         Linker.Strip:=false;
+                         for j:=1 to length(more) do
+                          case more[j] of
+                           'd' : initglobalswitches:=initglobalswitches+[cs_gdb_dbx];
+                           'g' : initglobalswitches:=initglobalswitches+[cs_gdb_gsym];
+                           'h' : initglobalswitches:=initglobalswitches+[cs_gdb_heaptrc];
+                           'c' : initglobalswitches:=initglobalswitches+[cs_checkpointer];
+{$ifdef EXTDEBUG}
+                           'p' : only_one_pass:=true;
+{$endif EXTDEBUG}
+                          else
+                            IllegalPara(opt);
+                          end;
+{$else GDB}
+                         Message(option_no_debug_support);
+                         Message(option_no_debug_support_recompile_fpc);
+{$endif GDB}
+                       end;
+                    end;
+              'h' : begin
+                      NoPressEnter:=true;
+                      WriteHelpPages;
+                    end;
+              'i' : if more='' then
+                     WriteInfo
+                    else
+                     begin
+                        { Specific info, which can be used in Makefiles }
+                        case More[1] of
+                          'S' : begin
+                                  case More[2] of
+                                   'O' : QuickInfo(source_os.shortname);
+{$ifdef Delphi !!!!!!!!!}
+                                   'P' : QuickInfo('unknown');
+{$else}
+                                   'P' : QuickInfo(source_cpu_string);
+{$endif}
+                                  end;
+                                end;
+                          'T' : begin
+                                  case More[2] of
+                                   'O' : QuickInfo(target_os.shortname);
+                                   'P' : QuickInfo(target_cpu_string);
+                                  end;
+                                end;
+                          'V' : QuickInfo(version_string);
+                          'D' : QuickInfo(date_string);
+                        else
+                          IllegalPara(Opt);
+                        end;
+                     end;
+              'I' : AddPathToList(includesearchpath,More,not firstpass);
+              'k' : if more<>'' then
+                     Linker.LinkOptions:=Linker.LinkOptions+' '+More
+                    else
+                     IllegalPara(opt);
+              'l' : if more='' then
+                      DoWriteLogo:=true
+                    else
+                      IllegalPara(opt);
+              'n' : if More='' then
+                     read_configfile:=false
+                    else
+                     IllegalPara(opt);
+              'o' : if More<>'' then
+                     Fsplit(More,d,OutputFile,e)
+                    else
+                     IllegalPara(opt);
+              'p' : begin
+                      if UnsetBool(More, 0) then
+                        begin
+                          initmoduleswitches:=initmoduleswitches-[cs_profile];
+                          undef_symbol('FPC_PROFILE');
+                        end
+                      else
+                        case more[1] of
+                         'g' : if (length(opt)=3) and UnsetBool(more, 1) then
+                                begin
+                                  initmoduleswitches:=initmoduleswitches-[cs_profile];
+                                  undef_symbol('FPC_PROFILE');
+                                end
+                               else
+                                begin
+                                  initmoduleswitches:=initmoduleswitches+[cs_profile];
+                                  def_symbol('FPC_PROFILE');
+                               end;
+                        else
+                          IllegalPara(opt);
+                        end;
+                    end;
+{$ifdef linux}
+              'P' : initglobalswitches:=initglobalswitches+[cs_asm_pipe];
+{$endif}
+              's' : initglobalswitches:=initglobalswitches+[cs_asm_extern,cs_link_extern];
+              'S' : begin
+                      for j:=1 to length(more) do
+                       case more[j] of
+                        '2' : initmodeswitches:=objfpcmodeswitches;
+                        'c' : initmoduleswitches:=initmoduleswitches+[cs_support_c_operators];
+                        'd' : initmodeswitches:=delphimodeswitches;
+                        'e' : begin
+                                val(copy(more,j+1,length(more)-j),l,code);
+                                if (code<>0) then
+                                 SetMaxErrorCount(1)
+                                else
+                                 begin
+                                   SetMaxErrorCount(l);
+                                   break;
+                                 end;
+                              end;
+                        'g' : initmoduleswitches:=initmoduleswitches+[cs_support_goto];
+                        'h' : initlocalswitches:=initlocalswitches+[cs_ansistrings];
+                        'i' : initmoduleswitches:=initmoduleswitches+[cs_support_inline];
+                        'm' : initmoduleswitches:=initmoduleswitches+[cs_support_macro];
+                        'o':  initmodeswitches:=tpmodeswitches;
+                        'p' : initmodeswitches:=gpcmodeswitches;
+                        's' : initglobalswitches:=initglobalswitches+[cs_constructor_name];
+                        't' : initmoduleswitches:=initmoduleswitches+[cs_static_keyword];
+                        'v' : Message1(option_obsolete_switch,'-Sv');
+                       else
+                        IllegalPara(opt);
+                       end;
+                    end;
+              'T' : begin
+                      more:=Upper(More);
+                      if not target_is_set then
+                       begin
+                       { remove old target define }
+                         undef_symbol(target_info.short_name);
+                       { load new target }
+                         if not(set_string_target(More)) then
+                           IllegalPara(opt);
+                       { set new define }
+                         def_symbol(target_info.short_name);
+                         if not asm_is_set then
+                           initoutputformat:=target_asm.id;
+                         target_is_set:=true;
+                       end
+                      else
+                       if More<>target_info.short_name then
+                        Message1(option_target_is_already_set,target_info.short_name);
+                    end;
+              'u' : undef_symbol(upper(More));
+              'U' : begin
+                      for j:=1 to length(more) do
+                       case more[j] of
+                        'n' : initglobalswitches:=initglobalswitches-[cs_check_unit_name];
+                        'p' : begin
+                                Message2(option_obsolete_switch_use_new,'-Up','-Fu');
+                                break;
+                              end;
+                        's' : initmoduleswitches:=initmoduleswitches+[cs_compilesystem];
+                       else
+                         IllegalPara(opt);
+                       end;
+                    end;
+              'v' : if not setverbosity(More) then
+                     IllegalPara(opt);
+              'W' : begin
+                      for j:=1 to length(More) do
+                       case More[j]of
+                        'B': bind_win32_dll:=true;
+                        'C': apptype:=at_cui;
+                        'G': apptype:=at_gui;
+                        'N': RelocSection:=false;
+                        'R': RelocSection:=true;
+                       else
+                        IllegalPara(opt);
+                       end;
+                    end;
+              'X' : begin
+                      for j:=1 to length(More) do
+                       case More[j] of
+                        'c' : Linker.LinkToC:=true;
+                        's' : Linker.Strip:=true;
+                        'D' : begin
+                                def_symbol('FPC_LINK_DYNAMIC');
+                                undef_symbol('FPC_LINK_STATIC');
+                                initglobalswitches:=initglobalswitches+[cs_link_shared];
+                                initglobalswitches:=initglobalswitches-[cs_link_static];
+                              end;
+                        'S' : begin
+                                def_symbol('FPC_LINK_STATIC');
+                                undef_symbol('FPC_LINK_DYNAMIC');
+                                initglobalswitches:=initglobalswitches-[cs_link_shared];
+                                initglobalswitches:=initglobalswitches+[cs_link_static];
+                              end;
+                       else
+                         IllegalPara(opt);
+                       end;
+                    end;
+       { give processor specific options a chance }
+         else
+          interpret_proc_specific_options(opt);
+         end;
+       end;
+ '@' : begin
+         Message(option_no_nested_response_file);
+         Stop;
+       end;
+  else
+   begin
+     if (length(param_file)<>0) then
+       Message(option_only_one_source_support);
+     param_file:=opt;
+   end;
+  end;
+end;
+
+
+procedure Toption.Interpret_file(const filename : string);
+
+  procedure RemoveSep(var fn:string);
+  var
+    i : longint;
+  begin
+    i:=0;
+    while (i<length(fn)) and (fn[i+1] in [',',' ',#9]) do
+     inc(i);
+    Delete(fn,1,i);
+  end;
+
+  function GetName(var fn:string):string;
+  var
+    i : longint;
+  begin
+    i:=0;
+    while (i<length(fn)) and (fn[i+1] in ['a'..'z','A'..'Z','0'..'9','_','-']) do
+     inc(i);
+    GetName:=Copy(fn,1,i);
+    Delete(fn,1,i);
+  end;
+
+const
+  maxlevel=16;
+var
+  f     : text;
+  s,
+  opts  : string;
+  skip  : array[0..maxlevel-1] of boolean;
+  level : longint;
+begin
+{ avoid infinite loop }
+  Inc(FileLevel);
+  If FileLevel>MaxLevel then
+   Message(option_too_many_cfg_files);
+{ open file }
+  assign(f,filename);
+{$ifdef extdebug}
+  Comment(V_Info,'trying to open file: '+filename);
+{$endif extdebug}
+  {$I-}
+  reset(f);
+  {$I+}
+  if ioresult<>0 then
+   begin
+     Message1(option_unable_open_file,filename);
+     exit;
+   end;
+  fillchar(skip,sizeof(skip),0);
+  level:=0;
+  while not eof(f) do
+   begin
+     readln(f,opts);
+     RemoveSep(opts);
+     if (opts<>'') then
+      begin
+        if opts[1]='#' then
+         begin
+           Delete(opts,1,1);
+           s:=upper(GetName(opts));
+           if (s='SECTION') then
+            begin
+              RemoveSep(opts);
+              s:=upper(GetName(opts));
+              if level=0 then
+               skip[level]:=not (check_symbol(s) or (s='COMMON'));
+            end
+           else
+            if (s='IFDEF') then
+             begin
+               RemoveSep(opts);
+               if Level>=maxlevel then
+                begin
+                  Message(option_too_many_ifdef);
+                  stop;
+                end;
+               inc(Level);
+               skip[level]:=(skip[level-1] or (not check_symbol(upper(GetName(opts)))));
+             end
+           else
+            if (s='IFNDEF') then
+             begin
+               RemoveSep(opts);
+               if Level>=maxlevel then
+                begin
+                  Message(option_too_many_ifdef);
+                  stop;
+                end;
+               inc(Level);
+               skip[level]:=(skip[level-1] or (check_symbol(upper(GetName(opts)))));
+             end
+           else
+            if (s='ELSE') then
+             skip[level]:=skip[level-1] or (not skip[level])
+           else
+            if (s='ENDIF') then
+             begin
+               skip[level]:=false;
+               if Level=0 then
+                begin
+                  Message(option_too_many_endif);
+                  stop;
+                end;
+               dec(level);
+             end
+           else
+            if (not skip[level]) then
+             begin
+               if (s='DEFINE') then
+                begin
+                  RemoveSep(opts);
+                  def_symbol(upper(GetName(opts)));
+                end
+              else
+               if (s='UNDEF') then
+                begin
+                  RemoveSep(opts);
+                  undef_symbol(upper(GetName(opts)));
+                end
+              else
+               if (s='WRITE') then
+                begin
+                  Delete(opts,1,1);
+                  WriteLn(opts);
+                end
+              else
+               if (s='INCLUDE') then
+                begin
+                  Delete(opts,1,1);
+                  Interpret_file(opts);
+                end;
+            end;
+         end
+        else
+         begin
+           if (not skip[level]) and (opts[1]='-') then
+            interpret_option(opts)
+         end;
+      end;
+   end;
+  if Level>0 then
+   Message(option_too_less_endif);
+  Close(f);
+  Dec(FileLevel);
+end;
+
+
+procedure toption.read_parameters;
+var
+  opts       : string;
+  paramindex : longint;
+begin
+  paramindex:=0;
+  while paramindex<paramcount do
+   begin
+     inc(paramindex);
+     opts:=paramstr(paramindex);
+     if firstpass then
+      begin
+      { only parse define,undef,target,verbosity and link options }
+        if (opts[1]='-') and (opts[2] in ['i','d','v','T','u','n','X']) then
+         interpret_option(opts);
+      end
+     else
+      begin
+        if opts[1]='@' then
+         begin
+           Delete(opts,1,1);
+           Message1(option_reading_further_from,opts);
+           interpret_file(opts);
+         end
+        else
+         interpret_option(opts);
+      end;
+   end;
+end;
+
+
+procedure toption.parsecmd(cmd:string);
+var
+  i    : longint;
+  opts : string;
+begin
+  while (cmd<>'') do
+   begin
+     while cmd[1]=' ' do
+      delete(cmd,1,1);
+     i:=pos(' ',cmd);
+     if i=0 then
+      i:=255;
+     opts:=Copy(cmd,1,i-1);
+     Delete(cmd,1,i);
+     if firstpass then
+      begin
+      { only parse define,undef,target,verbosity and link options }
+        if (opts[1]='-') and (opts[2] in ['d','v','T','u','n','X']) then
+         interpret_option(opts);
+      end
+     else
+      begin
+        if opts[1]='@' then
+         begin
+           Delete(opts,1,1);
+           Message1(option_reading_further_from,opts);
+           interpret_file(opts);
+         end
+        else
+         interpret_option(opts);
+      end;
+   end;
+end;
+
+
+constructor TOption.Init;
+begin
+  DoWriteLogo:=false;
+  NoPressEnter:=false;
+  FirstPass:=false;
+  FileLevel:=0;
+end;
+
+
+destructor TOption.Done;
+begin
+end;
+
+
+{****************************************************************************
+                              Callable Routines
+****************************************************************************}
+
+procedure read_arguments(cmd:string);
+var
+  configpath : pathstr;
+  option     : poption;
+begin
+{$ifdef Delphi}
+  option:=new(poption386,Init);
+{$endif Delphi}
+{$ifdef i386}
+  option:=new(poption386,Init);
+{$else}
+  {$ifdef m68k}
+    option:=new(poption68k,Init);
+  {$else}
+    option:=new(poption,Init);
+  {$endif}
+{$endif}
+{ Load messages }
+  if (cmd='') and (paramcount=0) then
+   Option^.WriteHelpPages;
+
+{ default defines }
+  def_symbol(target_info.short_name);
+  def_symbol('FPK');
+  def_symbol('FPC');
+  def_symbol('VER'+version_nr);
+  def_symbol('VER'+version_nr+'_'+release_nr);
+  def_symbol('VER'+version_nr+'_'+release_nr+'_'+patch_nr);
+
+{ Temporary defines, until things settle down }
+{$ifdef TESTOBJEXT}
+  def_symbol('FPC_TESTOBJEXT');
+{$endif def TESTOBJEXT}
+{$IfnDef OLDVAL}
+  def_symbol('VALINTERNCOMPILED');
+{$EndIf OLDVAL}
+  def_symbol('NEWATT');
+  def_symbol('NOSTRANSI');  { use SHORTSTR,ANSISTR etc. }
+{$ifndef OLDREAD}
+  def_symbol('NEWREADINT'); { use SHORTSTR,ANSISTR etc. }
+{$endif}
+  def_symbol('HASFINALIZE');
+  def_symbol('INTERNALADDR');
+  def_symbol('NEWWRITEARRAY');
+  def_symbol('INTERNDOUBLE');
+
+{ some stuff for TP compatibility }
+{$ifdef i386}
+  def_symbol('CPU86');
+  def_symbol('CPU87');
+  if (target_info.target in [target_i386_GO32V1,target_i386_GO32V2]) then
+   def_symbol('DPMI'); { MSDOS is not defined in BP when target is DPMI }
+{$endif}
+{$ifdef m68k}
+  def_symbol('CPU68');
+{$endif}
+
+{ get default messagefile }
+{$ifdef Delphi}
+  msgfilename:=dmisc.getenv('PPC_ERROR_FILE');
+{$else Delphi}
+  msgfilename:=dos.getenv('PPC_ERROR_FILE');
+{$endif Delphi}
+{ default configfile }
+  if (cmd<>'') and (cmd[1]='[') then
+   begin
+     ppccfg:=Copy(cmd,2,pos(']',cmd)-2);
+     Delete(cmd,1,pos(']',cmd));
+   end
+  else
+   begin
+{$ifdef i386}
+     ppccfg:='ppc386.cfg';
+{$else}
+     ppccfg:='ppc.cfg';
+{$endif}
+   end;
+
+{ Order to read ppc386.cfg:
+   1 - current dir
+   2 - configpath
+   3 - compiler path }
+{$ifdef Delphi}
+  configpath:=FixPath(dmisc.getenv('PPC_CONFIG_PATH'),false);
+{$else Delphi}
+  configpath:=FixPath(dos.getenv('PPC_CONFIG_PATH'),false);
+{$endif Delphi}
+{$ifdef linux}
+  if configpath='' then
+   configpath:='/etc/';
+{$endif}
+  if ppccfg<>'' then
+   begin
+     read_configfile:=true;
+     if not FileExists(ppccfg) then
+      begin
+{$ifdef linux}
+        if (dos.getenv('HOME')<>'') and FileExists(FixPath(dos.getenv('HOME'),false)+'.'+ppccfg) then
+         ppccfg:=FixPath(dos.getenv('HOME'),false)+'.'+ppccfg
+        else
+{$endif}
+         if FileExists(configpath+ppccfg) then
+          ppccfg:=configpath+ppccfg
+        else
+{$ifndef linux}
+         if FileExists(exepath+ppccfg) then
+          ppccfg:=exepath+ppccfg
+        else
+{$endif}
+         read_configfile:=false;
+      end;
+   end
+  else
+   read_configfile:=false;
+
+{ Read commandline and configfile }
+  target_is_set:=false;
+  asm_is_set:=false;
+
+  param_file:='';
+
+  if read_configfile then
+   begin
+   { read the parameters quick, only -v -T }
+     option^.firstpass:=true;
+     if cmd<>'' then
+       option^.parsecmd(cmd)
+     else
+       option^.read_parameters;
+     if read_configfile then
+      begin
+{$ifdef EXTDEBUG}
+        Comment(V_Debug,'read config file: '+ppccfg);
+{$endif EXTDEBUG}
+        option^.interpret_file(ppccfg);
+      end;
+   end;
+  option^.firstpass:=false;
+  if cmd<>'' then
+    option^.parsecmd(cmd)
+  else
+    option^.read_parameters;
+
+{ Stop if errors in options }
+  if ErrorCount>0 then
+   Stop;
+
+{ write logo if set }
+  if option^.DoWriteLogo then
+   option^.WriteLogo;
+
+{ Check file to compile }
+  if param_file='' then
+   begin
+     Message(option_no_source_found);
+     Stop;
+   end;
+{$ifndef linux}
+  param_file:=FixFileName(param_file);
+{$endif}
+  fsplit(param_file,inputdir,inputfile,inputextension);
+  if inputextension='' then
+   begin
+     if FileExists(inputdir+inputfile+target_os.sourceext) then
+      inputextension:=target_os.sourceext
+     else
+      if FileExists(inputdir+inputfile+target_os.pasext) then
+       inputextension:=target_os.pasext;
+   end;
+
+{ add unit environment and exepath to the unit search path }
+  if inputdir<>'' then
+   AddPathToList(Unitsearchpath,inputdir,true);
+{$ifdef Delphi}
+  AddPathToList(UnitSearchPath,dmisc.getenv(target_info.unit_env),false);
+{$else}
+  AddPathToList(UnitSearchPath,dos.getenv(target_info.unit_env),false);
+{$endif Delphi}
+  AddPathToList(UnitSearchPath,ExePath,false);
+  { Add unit dir to the object and library path }
+  AddPathToList(objectsearchpath,unitsearchpath,false);
+  AddPathToList(Linker.librarysearchpath,unitsearchpath,false);
+
+{ switch assembler if it's binary and we got -a on the cmdline }
+  if (cs_asm_leave in initglobalswitches) and
+     (target_asm.id in binassem) then
+   begin
+     Message(option_switch_bin_to_src_assembler);
+     set_target_asm(target_info.assemsrc);
+     initoutputformat:=target_asm.id;
+   end;
+
+  MaybeLoadMessageFile;
+
+  dispose(option,Done);
+end;
+
+
+end.
+{
+  $Log$
+  Revision 1.1  1999-06-11 13:28:40  peter
+    * reinserted
+
+  Revision 1.111  1999/06/10 23:52:31  pierre
+   * merged from fixes branch
+
+  Revision 1.110.2.1  1999/06/10 23:37:17  pierre
+   * language switch before help screen
+
+  Revision 1.110  1999/05/27 19:44:40  peter
+    * removed oldasm
+    * plabel -> pasmlabel
+    * -a switches to source writing automaticly
+    * assembler readers OOPed
+    * asmsymbol automaticly external
+    * jumptables and other label fixes for asm readers
+
+  Revision 1.109  1999/05/18 14:11:46  peter
+    * stop after errors in options
+
+  Revision 1.108  1999/05/17 14:14:15  pierre
+   + -gc for check pointer with heaptrc
+
+  Revision 1.107  1999/05/16 02:28:59  peter
+    * removed -Fg and -Up
+
+  Revision 1.106  1999/05/06 09:05:20  peter
+    * generic write_float and str_float
+    * fixed constant float conversions
+
+  Revision 1.105  1999/05/04 21:44:51  florian
+    * changes to compile it with Delphi 4.0
+
+  Revision 1.104  1999/05/02 22:41:56  peter
+    * moved section names to systems
+    * fixed nasm,intel writer
+
+  Revision 1.103  1999/05/01 13:24:25  peter
+    * merged nasm compiler
+    * old asm moved to oldasm/
+
+  Revision 1.102  1999/04/26 18:29:55  peter
+    * farpointerdef moved into pointerdef.is_far
+
+  Revision 1.101  1999/04/26 13:31:35  peter
+    * release storenumber,double_checksum
+
+  Revision 1.100  1999/04/17 13:12:21  peter
+    * addr() internal
+
+  Revision 1.99  1999/04/16 11:49:44  peter
+    + tempalloc
+    + -at to show temp alloc info in .s file
+
+  Revision 1.98  1999/04/15 12:19:56  peter
+    + finalization support
+
+  Revision 1.97  1999/04/10 16:15:02  peter
+    * fixed browcol
+    + -ar to show regalloc info in .s file
+
+  Revision 1.96  1999/04/08 15:57:49  peter
+    + subrange checking for readln()
+
+  Revision 1.95  1999/04/01 22:07:52  peter
+    * universal string names (ansistr instead of stransi) for val/str
+
+  Revision 1.94  1999/03/26 00:05:32  peter
+    * released valintern
+    + deffile is now removed when compiling is finished
+    * ^( compiles now correct
+    + static directive
+    * shrd fixed
+
+  Revision 1.93  1999/03/25 16:55:32  peter
+    + unitpath,librarypath,includepath,objectpath directives
+
+  Revision 1.92  1999/03/24 23:17:08  peter
+    * fixed bugs 212,222,225,227,229,231,233
+
+  Revision 1.91  1999/03/16 17:52:51  jonas
+    * changes for internal Val code (do a "make cycle OPT=-dvalintern" to test)
+    * in cgi386inl: also range checking for subrange types (compile with "-dreadrangecheck")
+    * in cgai386: also small fixes to emitrangecheck
+
+  Revision 1.90  1999/03/11 13:39:15  pierre
+   * initoutputformat also set by -T arg
+
+  Revision 1.89  1999/03/02 02:56:13  peter
+    + stabs support for binary writers
+    * more fixes and missing updates from the previous commit :(
+
+  Revision 1.88  1999/02/22 13:06:57  pierre
+    + -b and -bl options work !
+    + cs_local_browser ($L+) is disabled if cs_browser ($Y+)
+      is not enabled when quitting global section
+    * local vars and procedures are not yet stored into PPU
+
+  Revision 1.87  1999/02/03 10:18:12  pierre
+   * conditionnal code for extended check of virtual methods
+
+  Revision 1.86  1999/01/12 14:25:28  peter
+    + BrowserLog for browser.log generation
+    + BrowserCol for browser info in TCollections
+    * released all other UseBrowser
+
+  Revision 1.85  1998/12/30 22:04:34  michael
+  + Added -Sh switch
+
+  Revision 1.84  1998/12/28 15:45:48  peter
+    * fixes for parse_cmd
+
+  Revision 1.83  1998/12/19 00:23:50  florian
+    * ansistring memory leaks fixed
+
+  Revision 1.82  1998/12/18 17:25:50  peter
+    * removed temp symbols again :)
+
+  Revision 1.81  1998/12/16 14:29:00  jonas
+    * use of UnsetBool instead of manually checking for -Option-
+
+  Revision 1.80  1998/12/16 13:36:05  jonas
+    * allow '-' after the -C? options to disable them
+
+  Revision 1.78  1998/12/15 10:23:25  peter
+    + -iSO, -iSP, -iTO, -iTP
+
+  Revision 1.77  1998/12/14 17:23:05  peter
+    + -iV, -iD
+
+  Revision 1.76  1998/12/11 00:03:21  peter
+    + globtype,tokens,version unit splitted from globals
+
+  Revision 1.75  1998/12/08 10:18:10  peter
+    + -gh for heaptrc unit
+
+  Revision 1.74  1998/11/30 13:26:24  pierre
+    * the code for ordering the exported procs/vars was buggy
+    + added -WB to force binding (Ozerski way of creating DLL)
+      this is off by default as direct writing of .edata section seems
+      OK
+
+  Revision 1.73  1998/11/30 09:43:18  pierre
+    * some range check bugs fixed (still not working !)
+    + added DLL writing support for win32 (also accepts variables)
+    + TempAnsi for code that could be used for Temporary ansi strings
+      handling
+
+  Revision 1.72  1998/11/28 14:09:45  peter
+    * NOATTCDQ define
+
+  Revision 1.71  1998/11/27 14:50:39  peter
+    + open strings, $P switch support
+
+  Revision 1.70  1998/11/18 09:18:02  pierre
+    + automatic loading of profile unit with -pg option
+      in go32v2 mode (also defines FPC_PROFILE)
+    * some memory leaks removed
+    * unreleased temp problem with sets solved
+
+  Revision 1.69  1998/11/17 11:32:45  peter
+    * optimize str:='' in H+ mode
+    + -! to test ansistrings
+
+  Revision 1.68  1998/11/17 00:36:46  peter
+    * more ansistring fixes
+
+  Revision 1.67  1998/11/13 15:40:20  pierre
+    + added -Se in Makefile cvstest target
+    + lexlevel cleanup
+      normal_function_level main_program_level and unit_init_level defined
+    * tins_cache grown to A_EMMS (gave range check error in asm readers)
+      (test added in code !)
+    * -Un option was wrong
+    * _FAIL and _SELF only keyword inside
+      constructors and methods respectively
+
+  Revision 1.66  1998/11/13 10:18:08  peter
+    + nil constants
+
+  Revision 1.65  1998/11/11 12:34:53  peter
+    * fixed small typo
+
+  Revision 1.64  1998/11/10 17:54:12  peter
+    * -g disables linker.strip
+
+  Revision 1.63  1998/11/05 12:02:49  peter
+    * released useansistring
+    * removed -Sv, its now available in fpc modes
+
+  Revision 1.62  1998/11/04 10:11:39  peter
+    * ansistring fixes
+
+  Revision 1.61  1998/10/27 08:24:11  pierre
+   -lS and -lT options changed to -iS and -iT
+
+  Revision 1.60  1998/10/26 22:23:33  peter
+    + fixpath() has an extra option to allow a ./ as path
+
+  Revision 1.59  1998/10/26 14:19:27  pierre
+    + added options -lS and -lT for source and target os output
+      (to have a easier way to test OS_SOURCE abd OS_TARGET in makefiles)
+    * several problems with rtti data
+      (type of sym was not checked)
+      assumed to be varsym when they could be procsym or property syms !!
+
+  Revision 1.58  1998/10/20 09:32:55  peter
+    * removed some unused vars
+
+  Revision 1.57  1998/10/16 13:37:23  florian
+    + switch -FD added to specify the path for utilities
+
+  Revision 1.56  1998/10/15 12:37:43  pierre
+    + passes vmt offset to HELP_CONSTRUCTOR for objects
+
+  Revision 1.55  1998/10/13 13:10:19  peter
+    * new style for m68k/i386 infos and enums
+
+  Revision 1.54  1998/10/13 08:19:40  pierre
+    + source_os is now set correctly for cross-processor compilers
+      (tos contains all target_infos and
+       we use CPU86 and CPU68 conditionnals to
+       get the source operating system
+       this only works if you do not undefine
+       the source target  !!)
+    * several cg68k memory leaks fixed
+    + started to change the code so that it should be possible to have
+      a complete compiler (both for m68k and i386 !!)
+
+  Revision 1.53  1998/10/09 13:00:25  pierre
+    * msgfile existence tested
+
+  Revision 1.52  1998/10/08 17:17:22  pierre
+    * current_module old scanner tagged as invalid if unit is recompiled
+    + added ppheap for better info on tracegetmem of heaptrc
+      (adds line column and file index)
+    * several memory leaks removed ith help of heaptrc !!
+
+  Revision 1.51  1998/10/05 13:53:42  peter
+    + -Se<value>
+
+  Revision 1.50  1998/10/02 09:24:21  peter
+    * more constant expression evaluators
+
+  Revision 1.49  1998/09/26 17:45:29  peter
+    + idtoken and only one token table
+
+  Revision 1.48  1998/09/25 09:57:07  peter
+    * moved -A to options.pas, becuase the code is the same
+
+  Revision 1.47  1998/09/24 23:47:03  peter
+    + -FE,-FU,-Sd
+
+  Revision 1.46  1998/09/23 15:39:06  pierre
+    * browser bugfixes
+      was adding a reference when looking for the symbol
+      if -bSYM_NAME was used
+
+  Revision 1.45  1998/09/22 17:13:47  pierre
+    + browsing updated and developed
+      records and objects fields are also stored
+
+  Revision 1.44  1998/09/21 08:45:11  pierre
+    + added vmt_offset in tobjectdef.write for fututre use
+      (first steps to have objects without vmt if no virtual !!)
+    + added fpu_used field for tabstractprocdef  :
+      sets this level to 2 if the functions return with value in FPU
+      (is then set to correct value at parsing of implementation)
+      THIS MIGHT refuse some code with FPU expression too complex
+      that were accepted before and even in some cases
+      that don't overflow in fact
+      ( like if f : float; is a forward that finally in implementation
+       only uses one fpu register !!)
+      Nevertheless I think that it will improve security on
+      FPU operations !!
+    * most other changes only for UseBrowser code
+      (added symtable references for record and objects)
+      local switch for refs to args and local of each function
+      (static symtable still missing)
+      UseBrowser still not stable and probably broken by
+      the definition hash array !!
+
+  Revision 1.43  1998/09/18 08:01:33  pierre
+    + improvement on the usebrowser part
+      (does not work correctly for now)
+
+  Revision 1.42  1998/09/14 10:44:09  peter
+    * all internal RTL functions start with FPC_
+
+  Revision 1.41  1998/09/03 11:21:51  peter
+    * -al sets cs_asm_source
+
+  Revision 1.40  1998/08/31 08:50:32  peter
+    * fixed default msgfile loading which is now in verbose.pas
+
+  Revision 1.39  1998/08/29 13:52:38  peter
+    + new messagefile
+    * merged optione.msg into errore.msg
+
+  Revision 1.38  1998/08/25 12:42:38  pierre
+    * CDECL changed to CVAR for variables
+      specifications are read in structures also
+    + started adding GPC compatibility mode ( option  -Sp)
+    * names changed to lowercase
+
+  Revision 1.37  1998/08/20 16:10:52  pierre
+    Q
+    * Changed the -E switch to get better use of RHIDE v1.4.5
+
+  Revision 1.36  1998/08/18 09:05:59  peter
+    * new library options
+    * smartlink is now -Cx
+
+  Revision 1.35  1998/08/17 09:17:48  peter
+    * static/shared linking updates
+
+  Revision 1.34  1998/08/14 21:56:35  peter
+    * setting the outputfile using -o works now to create static libs
+
+  Revision 1.33  1998/08/10 23:53:47  peter
+    * released all temporary defines
+
+  Revision 1.32  1998/08/10 14:50:03  peter
+    + localswitches, moduleswitches, globalswitches splitting
+
+  Revision 1.30  1998/08/10 08:33:17  michael
+  -d was destroyed by last comit
+
+  Revision 1.29  1998/08/08 15:31:04  michael
+  + Reinstated -e option for linux
+
+  Revision 1.28  1998/07/17 10:06:18  michael
+  + under linux, looking for ppc38.cfg in bindir removed.
+
+  Revision 1.27  1998/07/07 11:19:58  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.26  1998/07/06 15:51:17  michael
+  Added length checking for string reading
+
+  Revision 1.25  1998/07/04 10:00:22  peter
+    + define HAS_PROPERTY
+
+  Revision 1.24  1998/07/01 15:28:49  peter
+    + better writeln/readln handling, now 100% like tp7
+
+  Revision 1.22  1998/06/13 00:10:07  peter
+    * working browser and newppu
+    * some small fixes against crashes which occured in bp7 (but not in
+      fpc?!)
+
+  Revision 1.21  1998/06/12 16:15:32  pierre
+    * external name 'C_var';
+      export name 'intern_C_var';
+      cdecl;
+      cdecl;external;
+      are now supported only with -Sv switch
+
+  Revision 1.20  1998/06/08 22:59:47  peter
+    * smartlinking works for win32
+    * some defines to exclude some compiler parts
+
+  Revision 1.19  1998/06/04 23:51:46  peter
+    * m68k compiles
+    + .def file creation moved to gendef.pas so it could also be used
+      for win32
+
+  Revision 1.17  1998/05/25 17:11:40  pierre
+    * firstpasscount bug fixed
+      now all is already set correctly the first time
+      under EXTDEBUG try -gp to skip all other firstpasses
+      it works !!
+    * small bug fixes
+      - for smallsets with -dTESTSMALLSET
+      - some warnings removed (by correcting code !)
+
+  Revision 1.16  1998/05/23 01:21:12  peter
+    + aktasmmode, aktoptprocessor, aktoutputformat
+    + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
+    + $LIBNAME to set the library name where the unit will be put in
+    * splitted cgi386 a bit (codeseg to large for bp7)
+    * nasm, tasm works again. nasm moved to ag386nsm.pas
+
+  Revision 1.15  1998/05/20 09:42:34  pierre
+    + UseTokenInfo now default
+    * unit in interface uses and implementation uses gives error now
+    * only one error for unknown symbol (uses lastsymknown boolean)
+      the problem came from the label code !
+    + first inlined procedures and function work
+      (warning there might be allowed cases were the result is still wrong !!)
+    * UseBrower updated gives a global list of all position of all used symbols
+      with switch -gb
+
+  Revision 1.14  1998/05/12 10:46:59  peter
+    * moved printstatus to verb_def
+    + V_Normal which is between V_Error and V_Warning and doesn't have a
+      prefix like error: warning: and is included in V_Default
+    * fixed some messages
+    * first time parameter scan is only for -v and -T
+    - removed old style messages
+
+  Revision 1.13  1998/05/08 09:21:20  michael
+  * Added missing -Fl message to messages file.
+  * Corrected mangling of file names when doing Linklib
+  * -Fl now actually WORKS.
+  * Librarysearchpath is now a field in linker object.
+
+  Revision 1.12  1998/05/06 08:38:41  pierre
+    * better position info with UseTokenInfo
+      UseTokenInfo greatly simplified
+    + added check for changed tree after first time firstpass
+      (if we could remove all the cases were it happen
+      we could skip all firstpass if firstpasscount > 1)
+      Only with ExtDebug
+
+  Revision 1.11  1998/05/04 17:54:27  peter
+    + smartlinking works (only case jumptable left todo)
+    * redesign of systems.pas to support assemblers and linkers
+    + Unitname is now also in the PPU-file, increased version to 14
+
+  Revision 1.10  1998/05/01 16:38:44  florian
+    * handling of private and protected fixed
+    + change_keywords_to_tp implemented to remove
+      keywords which aren't supported by tp
+    * break and continue are now symbols of the system unit
+    + widestring, longstring and ansistring type released
+
+  Revision 1.9  1998/04/30 15:59:40  pierre
+    * GDB works again better :
+      correct type info in one pass
+    + UseTokenInfo for better source position
+    * fixed one remaining bug in scanner for line counts
+    * several little fixes
+
+  Revision 1.8  1998/04/27 15:45:20  peter
+    + -Xl for smartlink
+    + target_info.arext = .a
+
+  Revision 1.7  1998/04/23 12:07:25  peter
+    * fixed -i
+
+  Revision 1.6  1998/04/08 16:58:03  pierre
+    * several bugfixes
+      ADD ADC and AND are also sign extended
+      nasm output OK (program still crashes at end
+      and creates wrong assembler files !!)
+      procsym types sym in tdef removed !!
+
+  Revision 1.5  1998/04/08 12:31:00  peter
+    + .ppc386.cfg and #INCLUDE support
+
+  Revision 1.4  1998/04/07 13:19:46  pierre
+    * bugfixes for reset_gdb_info
+      in MEM parsing for go32v2
+      better external symbol creation
+      support for rhgdb.exe (lowercase file names)
+}