{
    $Id$
    Copyright (c) 1993-98 by Florian Klaempfl

    This unit does the parsing process

    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.

 ****************************************************************************
}
{$ifdef tp}
  {$E+,N+,D+,F+}
{$endif}
unit parser;

  interface

    procedure compile(const filename:string;compile_system:boolean);
    procedure initparser;

  implementation

    uses
       dos,objects,cobjects,globals,scanner,systems,symtable,tree,aasm,
       types,strings,pass_1,hcodegen,files,verbose,script,import
{$ifdef i386}
       ,i386
       ,cgi386
       ,cgai386
       ,tgeni386
       ,aopt386
{$endif i386}
{$ifdef m68k}
        ,m68k
        ,cg68k
        ,tgen68k
        ,cga68k
{$endif m68k}
       { parser units }
       ,pbase,pmodules,pdecl,
       { assembling & linking }
       assemble,
       link;

  { dummy variable for search when calling exec }
  var
     file_found : boolean;

    procedure readconstdefs;

      begin
         s32bitdef:=porddef(globaldef('longint'));
         u32bitdef:=porddef(globaldef('ulong'));
         cstringdef:=pstringdef(globaldef('string'));
{$ifdef UseLongString}
         clongstringdef:=pstringdef(globaldef('longstring'));
{$endif UseLongString}
{$ifdef UseAnsiString}
         cansistringdef:=pstringdef(globaldef('ansistring'));
{$endif UseAnsiString}
         cchardef:=porddef(globaldef('char'));
{$ifdef i386}
         c64floatdef:=pfloatdef(globaldef('s64real'));
{$endif}
{$ifdef m68k}
         c64floatdef:=pfloatdef(globaldef('s32real'));
{$endif m68k}
         s80floatdef:=pfloatdef(globaldef('s80real'));
         s32fixeddef:=pfloatdef(globaldef('cs32fixed'));
         voiddef:=porddef(globaldef('void'));
         u8bitdef:=porddef(globaldef('byte'));
         u16bitdef:=porddef(globaldef('word'));
         booldef:=porddef(globaldef('boolean'));
         voidpointerdef:=ppointerdef(globaldef('void_pointer'));
         cfiledef:=pfiledef(globaldef('file'));
      end;

    procedure initparser;

      begin
         forwardsallowed:=false;

         { ^M means a string or a char, because we don't parse a }
         { type declaration                                      }
         parse_types:=false;

         { we didn't parse a object or class declaration }
         { and no function header                        }
         testcurobject:=0;

         { create error defintion }
         generrordef:=new(perrordef,init);

         symtablestack:=nil;

         { a long time, this was forgotten }
         aktprocsym:=nil;

         current_module:=nil;

         loaded_units.init;

         usedunits.init;
      end;

    { moved out to save stack }
    var
       addparam : string;

    procedure compile(const filename:string;compile_system:boolean);
      var
         hp : pmodule;
         comp_unit : boolean;

         { some variables to save the compiler state }
         oldtoken : ttoken;
         oldpattern : stringid;

         oldpreprocstack : ppreprocstack;
         oldorgpattern,oldprocprefix : string;
         oldparse_types : boolean;
         oldinputbuffer : pchar;
         oldinputpointer : longint;
         olds_point,oldparse_only : boolean;
         oldc : char;
         oldcomment_level : word;

         oldimports,oldexports,oldresource,
         oldbsssegment,olddatasegment,oldcodesegment,
         oldexprasmlist,olddebuglist,
         oldinternals,oldexternals,oldconsts : paasmoutput;


         oldnextlabelnr : longint;

         oldswitches : Tcswitches;
         oldmacros,oldrefsymtable,oldsymtablestack : psymtable;


      procedure def_macro(const s : string);

        var
          mac : pmacrosym;

        begin
           mac:=pmacrosym(macros^.search(s));
           if mac=nil then
             begin
               mac:=new(pmacrosym,init(s));
               Message1(parser_m_macro_defined,mac^.name);
               macros^.insert(mac);
             end;
           mac^.defined:=true;
        end;

      procedure set_macro(const s : string;value : string);

        var
          mac : pmacrosym;

        begin
           mac:=pmacrosym(macros^.search(s));
           if mac=nil then
             begin
               mac:=new(pmacrosym,init(s));
               macros^.insert(mac);
             end
           else
             begin
                if assigned(mac^.buftext) then
                  freemem(mac^.buftext,mac^.buflen);
             end;
           Message2(parser_m_macro_set_to,mac^.name,value);
           mac^.buflen:=length(value);
           getmem(mac^.buftext,mac^.buflen);
           move(value[1],mac^.buftext^,mac^.buflen);
           mac^.defined:=true;
        end;

      procedure define_macros;

        var
           hp : pstring_item;

        begin
           hp:=pstring_item(commandlinedefines.first);
           while assigned(hp) do
             begin
               def_macro(hp^.str^);
               hp:=pstring_item(hp^.next);
             end;

           { set macros for version checking }
           set_macro('FPC_VERSION',version_nr);
           set_macro('FPC_RELEASE',release_nr);
           set_macro('FPC_PATCH',patch_nr);
        end;

      var
         a : PAsmFile;
         g : file;
         ftime : longint;
      label
         done;

      begin {compile}
         inc(compile_level);
         { save old state }

         { save symtable state }
         oldsymtablestack:=symtablestack;
         symtablestack:=nil;
         oldrefsymtable:=refsymtable;
         refsymtable:=nil;
         oldprocprefix:=procprefix;

         { a long time, this was only in init_parser
           but it should be reset to zero for each module }
         aktprocsym:=nil;

         { first, we assume a program }
         if not(assigned(current_module)) then
           begin
{!!!}
              current_module:=new(pmodule,init(filename,false));
              main_module:=current_module;
           end;
         { reset flags }
         current_module^.flags:=0;
         { ... and crc }
         current_module^.crc:=0;

         { save scanner state }
         oldmacros:=macros;
         oldpattern:=pattern;
         oldtoken:=token;
         oldorgpattern:=orgpattern;
         oldparse_types:=parse_types;
         oldpreprocstack:=preprocstack;

         oldinputbuffer:=inputbuffer;
         oldinputpointer:=inputpointer;
         olds_point:=s_point;
         oldc:=c;
         oldcomment_level:=comment_level;

         oldparse_only:=parse_only;

         { save assembler lists }
         olddatasegment:=datasegment;
         oldbsssegment:=bsssegment;
         oldcodesegment:=codesegment;
         olddebuglist:=debuglist;
         oldexternals:=externals;
         oldinternals:=internals;
         oldconsts:=consts;
         oldexprasmlist:=exprasmlist;
         oldimports:=importssection;
         oldexports:=exportssection;
         oldresource:=resourcesection;

         oldswitches:=aktswitches;
         oldnextlabelnr:=nextlabelnr;

         Message1(parser_i_compiling,filename);

         InitScanner(filename);

         aktswitches:=initswitches;

         { we need this to make the system unit }
         if compile_system then
          aktswitches:=aktswitches+[cs_compilesystem];

         aktpackrecords:=initpackrecords;

         { init code generator for a new module }
         codegen_newmodule;
         macros:=new(psymtable,init(macrosymtable));

         define_macros;

         { startup scanner }
         token:=yylex;

         { init asm writing }
         datasegment:=new(paasmoutput,init);
         codesegment:=new(paasmoutput,init);
         bsssegment:=new(paasmoutput,init);
         debuglist:=new(paasmoutput,init);
         externals:=new(paasmoutput,init);
         internals:=new(paasmoutput,init);
         consts:=new(paasmoutput,init);
         importssection:=nil;
         exportssection:=nil;
         resourcesection:=nil;

         { global switches are read, so further changes aren't allowed }
         current_module^.in_main:=true;

         { open assembler response }
         if (compile_level=1) then
          AsmRes.Init('ppas');

         { if the current file isn't a system unit  }
         { the the system unit will be loaded       }
         if not(cs_compilesystem in aktswitches) then
           begin
              { should be done in unit system (changing the field system_unit)
                                                                      FK
              }
              hp:=loadunit(upper(target_info.system_unit),true,true);
              systemunit:=hp^.symtable;
              readconstdefs;
              { we could try to overload caret by default }
              symtablestack:=systemunit;
              { if POWER is defined in the RTL then use it for caret overloading }
              getsym('POWER',false);
              if assigned(srsym) and (srsym^.typ=procsym) and
                 (overloaded_operators[CARET]=nil) then
                overloaded_operators[CARET]:=pprocsym(srsym);
           end
         else
           begin
              { create definitions for constants }
              registerdef:=false;
              s32bitdef:=new(porddef,init(s32bit,$80000000,$7fffffff));
              u32bitdef:=new(porddef,init(u32bit,0,$ffffffff));
              cstringdef:=new(pstringdef,init(255));
              { should we give a length to the default long and ansi string definition ?? }
{$ifdef UseLongString}
              clongstringdef:=new(pstringdef,longinit(-1));
{$endif UseLongString}
{$ifdef UseAnsiString}
              cansistringdef:=new(pstringdef,ansiinit(-1));
{$endif UseAnsiString}
              cchardef:=new(porddef,init(uchar,0,255));
{$ifdef i386}
              c64floatdef:=new(pfloatdef,init(s64real));
              s80floatdef:=new(pfloatdef,init(s80real));
{$endif}
{$ifdef m68k}
              c64floatdef:=new(pfloatdef,init(s32real));
              if (cs_fp_emulation in aktswitches) then
               s80floatdef:=new(pfloatdef,init(s32real))
              else
               s80floatdef:=new(pfloatdef,init(s80real));
{$endif}
              s32fixeddef:=new(pfloatdef,init(f32bit));

              { some other definitions }
              voiddef:=new(porddef,init(uvoid,0,0));
              u8bitdef:=new(porddef,init(u8bit,0,255));
              u16bitdef:=new(porddef,init(u16bit,0,65535));
              booldef:=new(porddef,init(bool8bit,0,1));
              voidpointerdef:=new(ppointerdef,init(voiddef));
              cfiledef:=new(pfiledef,init(ft_untyped,nil));
              systemunit:=nil;
           end;
         registerdef:=true;

         { current return type is void }
         procinfo.retdef:=voiddef;

         { reset lexical level }
         lexlevel:=0;

         { parse source }
{***BUGFIX}
         if (token=_UNIT) or (compile_level>1) then
            begin
                {If the compile level > 1 we get a nice "unit expected" error
                 message if we are trying to use a program as unit.}
                proc_unit;
                if current_module^.compiled then
                    goto done;
                comp_unit:=true;
            end
         else
           begin
              proc_program(token=_LIBRARY);
              comp_unit:=false;
           end;

         { Why? The definition of Pascal requires that everything
           after 'end.' is ignored!
         if not(cs_tp_compatible in aktswitches) then
            consume(_EOF); }

         if errorcount=0 then
           begin
             if current_module^.uses_imports then
              importlib^.generatelib;

             a:=new(PAsmFile,Init(filename));
             a^.WriteAsmSource;
             a^.DoAssemble;
             dispose(a,Done);

             { Check linking  => we are at first level in compile }
             if (compile_level=1) then
              begin
	        if Linker.ExeName='' then
                 Linker.SetFileName(FileName);
                if (comp_unit) then
                 begin
                   Linker.Make_Library;
                 end
                else
                 begin
                   if (cs_no_linking in initswitches) then
                    externlink:=true;
                   Linker.Link;
                 end;
              end;
           end
         else
           begin
              Message1(unit_e_total_errors,tostr(errorcount));
              Message(unit_f_errors_in_unit);
           end;
         { clear memory }
{$ifdef Splitheap}
         if testsplit then
           begin
           { temp heap should be empty after that !!!}
           codegen_donemodule;
           Releasetempheap;
           end;
         {else
           codegen_donemodule;}
{$endif Splitheap}
         { restore old state }
         { if already compiled jumps directly here }
done:
         { close trees }
{$ifdef disposetree}
         dispose(datasegment,Done);
         dispose(codesegment,Done);
         dispose(bsssegment,Done);
         dispose(debuglist,Done);
         dispose(externals,Done);
         dispose(internals,Done);
         dispose(consts,Done);
{$endif}

         { restore symtable state }
{$ifdef UseBrowser}
         if (compile_level>1) then
{ we want to keep the current symtablestack }
{$endif UseBrowser}
           begin
              refsymtable:=oldrefsymtable;
              symtablestack:=oldsymtablestack;
           end;

         procprefix:=oldprocprefix;

         { close the inputfiles }
{$ifndef UseBrowser}
         { but not if we want the names for the browser ! }
         current_module^.sourcefiles.done;
{$endif not UseBrowser}
         { restore scanner state }
         pattern:=oldpattern;
         token:=oldtoken;
         orgpattern:=oldorgpattern;
         parse_types:=oldparse_types;

         { call donescanner before restoring preprocstack, because }
         { donescanner tests for a empty preprocstack              }
         { and can also check for unused macros                    }
         donescanner(current_module^.compiled);
         dispose(macros,done);
         macros:=oldmacros;


         preprocstack:=oldpreprocstack;

         aktswitches:=oldswitches;
         inputbuffer:=oldinputbuffer;
         inputpointer:=oldinputpointer;
         s_point:=olds_point;
         c:=oldc;
         comment_level:=oldcomment_level;

         parse_only:=oldparse_only;

         { restore asmlists }
         datasegment:=olddatasegment;
         bsssegment:=oldbsssegment;
         codesegment:=oldcodesegment;
         debuglist:=olddebuglist;
         externals:=oldexternals;
         internals:=oldinternals;
         importssection:=oldimports;
         exportssection:=oldexports;
         resourcesection:=oldresource;

         nextlabelnr:=oldnextlabelnr;
         exprasmlist:=oldexprasmlist;
         consts:=oldconsts;

         nextlabelnr:=oldnextlabelnr;

         reset_gdb_info;
         if (compile_level=1) then
          begin
            if (not AsmRes.Empty) then
             begin
               Message1(exec_i_closing_script,AsmRes.Fn);
               AsmRes.WriteToDisk;
             end;
          end;
         dec(compile_level);
      end;

end.
{
  $Log$
  Revision 1.2  1998-03-26 11:18:30  florian
    - switch -Sa removed
    - support of a:=b:=0 removed

  Revision 1.1.1.1  1998/03/25 11:18:12  root
  * Restored version

  Revision 1.60  1998/03/24 21:48:32  florian
    * just a couple of fixes applied:
         - problem with fixed16 solved
         - internalerror 10005 problem fixed
         - patch for assembler reading
         - small optimizer fix
         - mem is now supported

  Revision 1.59  1998/03/20 23:31:33  florian
    * bug0113 fixed
    * problem with interdepened units fixed ("options.pas problem")
    * two small extensions for future AMD 3D support

  Revision 1.58  1998/03/13 22:45:58  florian
    * small bug fixes applied

  Revision 1.57  1998/03/10 17:19:29  peter
    * fixed bug0108
    * better linebreak scanning (concentrated in nextchar(), it supports
      #10, #13, #10#13, #13#10

  Revision 1.56  1998/03/10 16:27:40  pierre
    * better line info in stabs debug
    * symtabletype and lexlevel separated into two fields of tsymtable
    + ifdef MAKELIB for direct library output, not complete
    + ifdef CHAINPROCSYMS for overloaded seach across units, not fully
      working
    + ifdef TESTFUNCRET for setting func result in underfunction, not
      working

  Revision 1.55  1998/03/10 12:54:06  peter
    * def_symbol renamed to def_macro and use it in defines_macros

  Revision 1.54  1998/03/10 01:17:22  peter
    * all files have the same header
    * messages are fully implemented, EXTDEBUG uses Comment()
    + AG... files for the Assembler generation

  Revision 1.53  1998/03/06 00:52:34  peter
    * replaced all old messages from errore.msg, only ExtDebug and some
      Comment() calls are left
    * fixed options.pas

  Revision 1.52  1998/03/02 16:00:37  peter
    * -Ch works again

  Revision 1.51  1998/03/02 13:38:44  peter
    + importlib object
    * doesn't crash on a systemunit anymore
    * updated makefile and depend

  Revision 1.49  1998/02/28 00:20:31  florian
    * more changes to get import libs for Win32 working

  Revision 1.48  1998/02/27 22:27:56  florian
    + win_targ unit
    + support of sections
    + new asmlists: sections, exports and resource

  Revision 1.47  1998/02/24 10:29:17  peter
    * -a works again

  Revision 1.46  1998/02/24 00:19:14  peter
    * makefile works again (btw. linux does like any char after a \ )
    * removed circular unit with assemble and files
    * fixed a sigsegv in pexpr
    * pmodule init unit/program is the almost the same, merged them

  Revision 1.45  1998/02/22 23:03:25  peter
    * renamed msource->mainsource and name->unitname
    * optimized filename handling, filename is not seperate anymore with
      path+name+ext, this saves stackspace and a lot of fsplit()'s
    * recompiling of some units in libraries fixed
    * shared libraries are working again
    + $LINKLIB <lib> to support automatic linking to libraries
    + libraries are saved/read from the ppufile, also allows more libraries
      per ppufile

  Revision 1.44  1998/02/19 00:11:04  peter
    * fixed -g to work again
    * fixed some typos with the scriptobject

  Revision 1.43  1998/02/18 13:48:12  michael
  + Implemented an OS independent AsmRes object.

  Revision 1.42  1998/02/17 21:20:54  peter
    + Script unit
    + __EXIT is called again to exit a program
    - target_info.link/assembler calls
    * linking works again for dos
    * optimized a few filehandling functions
    * fixed stabs generation for procedures

  Revision 1.41  1998/02/16 12:51:35  michael
  + Implemented linker object

  Revision 1.40  1998/02/15 21:16:25  peter
    * all assembler outputs supported by assemblerobject
    * cleanup with assembleroutputs, better .ascii generation
    * help_constructor/destructor are now added to the externals
    - generation of asmresponse is not outputformat depended

  Revision 1.39  1998/02/14 01:45:26  peter
    * more fixes
    - pmode target is removed
    - search_as_ld is removed, this is done in the link.pas/assemble.pas
    + findexe() to search for an executable (linker,assembler,binder)

  Revision 1.38  1998/02/13 22:26:33  peter
    * fixed a few SigSegv's
    * INIT$$ was not written for linux!
    * assembling and linking works again for linux and dos
    + assembler object, only attasmi3 supported yet
    * restore pp.pas with AddPath etc.

  Revision 1.37  1998/02/13 10:35:17  daniel
  * Made Motorola version compilable.
  * Fixed optimizer

  Revision 1.36  1998/02/12 17:19:12  florian
    * fixed to get remake3 work, but needs additional fixes (output, I don't like
      also that aktswitches isn't a pointer)

  Revision 1.35  1998/02/12 11:50:16  daniel
  Yes! Finally! After three retries, my patch!

  Changes:

  Complete rewrite of psub.pas.
  Added support for DLL's.
  Compiler requires less memory.
  Platform units for each platform.

  Revision 1.34  1998/02/02 11:47:36  pierre
    + compilation stops at unit with error

  Revision 1.33  1998/02/01 22:41:08  florian
    * clean up
    + system.assigned([class])
    + system.assigned([class of xxxx])
    * first fixes of as and is-operator

  Revision 1.32  1998/01/30 17:31:23  pierre
    * bug of cyclic symtablestack fixed

  Revision 1.31  1998/01/29 12:13:21  michael
  * fixed Typos for library making

  Revision 1.30  1998/01/28 13:48:45  michael
  + Initial implementation for making libs from within FPC. Not tested, as compiler does not run

  Revision 1.29  1998/01/25 18:45:47  peter
    + Search for as and ld at startup
    + source_info works the same as target_info
    + externlink allows only external linking

  Revision 1.28  1998/01/23 21:14:59  carl
    * RunError 105 (file not open) with -Agas switch fix

  Revision 1.27  1998/01/23 17:55:11  michael
  + Moved linking stage to it's own unit (link.pas)
    Incorporated Pierres changes, but removed -E switch
    switch for not linking is now -Cn instead of -E

  Revision 1.26  1998/01/23 17:12:15  pierre
    * added some improvements for as and ld :
      - doserror and dosexitcode treated separately
      - PATH searched if doserror=2
    + start of long and ansi string (far from complete)
      in conditionnal UseLongString and UseAnsiString
    * options.pas cleaned (some variables shifted to globals)gl

  Revision 1.25  1998/01/22 14:47:16  michael
  + Reinstated linker options as -k option. How did they dissapear ?

  Revision 1.24  1998/01/17 01:57:36  michael
  + Start of shared library support. First working version.

  Revision 1.23  1998/01/16 22:34:37  michael
  * Changed 'conversation' to 'conversion'. Waayyy too much chatting going on
    in this compiler :)

  Revision 1.22  1998/01/14 12:52:04  michael
  - Removed the 'Assembled' line and replaced 'Calling Linker/assembler...'
    with 'Assembling/linking...'. Too much verbosity when V_info is on.

  Revision 1.21  1998/01/13 16:15:56  pierre
    *  bug in interdependent units handling
       - primary unit was not in loaded_units list
       - current_module^.symtable was assigned too early
       - donescanner must not call error if the compilation
       of the unit was done at a higher level.

  Revision 1.20  1998/01/11 10:54:22  florian
    + generic library support

  Revision 1.19  1998/01/11 04:17:11  carl
  + correct heap and memory variables for m68k targets

  Revision 1.18  1998/01/08 23:56:39  florian
    * parser unit divided into several smaller units

  Revision 1.17  1998/01/08 17:10:12  florian
    * the name of the initialization part of a unit was sometimes written
      in lower case

  Revision 1.16  1998/01/07 00:16:56  michael
  Restored released version (plus fixes) as current

  Revision 1.13  1997/12/14 22:43:21  florian
    + command line switch -Xs for DOS (passes -s to the linker to strip symbols from
      executable)
    * some changes of Carl-Eric implemented

  Revision 1.12  1997/12/12 13:28:31  florian
  + version 0.99.0
  * all WASM options changed into MASM
  + -O2 for Pentium II optimizations

  Revision 1.11  1997/12/10 23:07:21  florian
  * bugs fixed: 12,38 (also m68k),39,40,41
  + warning if a system unit is without -Us compiled
  + warning if a method is virtual and private (was an error)
  * some indentions changed
  + factor does a better error recovering (omit some crashes)
  + problem with @type(x) removed (crashed the compiler)

  Revision 1.10  1997/12/09 13:50:36  carl
  * bugfix of possible alignment problems with m68k
  * bugfix of circular unit use -- could still give a stack overflow,
    so changed to fatalerror instead.
  * bugfix of nil procedural variables, fpc = @nil is illogical!
    (if was reversed!)

  Revision 1.9  1997/12/08 13:31:31  daniel
  * File was in DOS format. Translated to Unix.

  Revision 1.8  1997/12/08 10:01:08  pierre
    * nil for a procvar const was not allowed (os2_targ.pas not compilable)
    * bug in loadunit for units in implementation part already loaded
      (crashed on dos_targ.pas, thanks to Daniel who permitted me
      to find this bug out)

  Revision 1.7  1997/12/04 17:47:50  carl
   + renamed m68k units and refs to these units according to cpu rules.

  Revision 1.6  1997/12/02 15:56:13  carl
  * bugfix of postfixoperator with pd =nil
  * bugfix of motorola instructions types for exit code.

  Revision 1.5  1997/12/01 18:14:33  pierre
      * fixes a bug in nasm output due to my previous changes

  Revision 1.3  1997/11/28 18:14:40  pierre
   working version with several bug fixes

  Revision 1.2  1997/11/27 17:59:46  carl
  * made it compile under BP (line too long errors)

  Revision 1.1.1.1  1997/11/27 08:32:57  michael
  FPC Compiler CVS start


  Pre-CVS log:

  CEC   Carl-Eric Codere
  FK    Florian Klaempfl
  PM    Pierre Muller
  +     feature added
  -     removed
  *     bug fixed or changed



  History (started with version 0.9.0):
       5th november 1996:
         * adapted to 0.9.0
      25th november 1996:
         * more stuff adapted
       9th december 1996:
         + support for different inline assemblers added (FK)
      22th september:
         + support for PACKED RECORD implemented (FK)
      24th september:
         + internal support of system.seg added (FK)
         * system.ofs bug fixed (FK)
         * problem with compiler switches solved (see also pass_1.pas) (FK)
         * all aktswitch memory is now recoverd (see also scanner.pas) (FK)
      24th september 1997:
         * bug in ESI offset, pushed only if not nested, changed in cgi386.pas in v93 by (FK)
           but forgotten here (PM)
      25th september:
         + parsing of open arrays implemented (FK)
         + parsing of high and low implemented (FK)
         + open array support also for proc vars added (FK)
      1th october:
         * in typed constants is now the conversion int -> real
           automatically done (FK)
      3rd october 1997:
         + started conversion to motorola 68000 - ifdef m68k to find
           changes (this makes the code look horrible, may later separate
           in includes?) - look for all ifdef i386 and ifdef m68k to see
           changes. (CEC)
         - commented out regnames (was unused) (CEC)
         + peepholeopt put in i386 define (not yet available for motorola
            68000) (CEC)
         + i386 defines around a_att, in a_o and around a_wasm, a_nasm (CEC).
         + code for in_ord_x (PM)
      4th october 1997:
         + checking for double definitions of function/procedure
           with same parameters in interface (PM)
         + enums with jumps set the boolean has_jumps and
           disable the succ and pred use (PM)
       9th october 1997:
         * Fixed problem with 80float on the 68000 output, caused a GPF (CEC).
      13th october 1997:
         + Added support for Motorola Standard assembler. (CEC)
       15th october 1997:
         + added code for static modifier for objects variables and methods
           controlled by -St switch at command line (PM)
      17th october 1997:
        + Added support for Motorola inline assembler (CEC)
        * Bugfix with .align 4,0x90, this is NOT allowed in TASM/MASM/WASM (CEC).
        + procedure set_macro and setting of fpc_* macros (FK)
      19th october 1997:
        * Bugfix of RTS on 68000 target. PC Counter would become corrupt
          with paramsize (CEC).
      23th october 1997:
        * Small bugfixes concerning SUBI #const,address_reg (CEC).
      24th october 1997:
        * array[boolean] works now (FK)
      25th october 1997:
        + CDECL and STDCALL (FK)
        * ASSEMBLER isn't a keyword anymore (FK)
       3rd november 1997:
         + added symdif for sets (PM)
       5th november 1997:
         * changed all while token<>ATOKEN do consume(token);
           by a procedure call consume_all_untill(ATOKEN)
           to test for _EOF (PM)
         * aktobjectname was not reset to '' at the end of objectcomponenten (PM)
       14th november 1997:
         * removed bug for procvar where the type was not allways set correctly (PM)
         + integer const not in longint range converted to real constant (PM)
       25th november 1997:
         * removed bugs due to wrong current_module references in compile procedure (PM)

}

