فهرست منبع

+ NEWINPUT for a better inputfile and scanner object

peter 27 سال پیش
والد
کامیت
911abb5abc

+ 10 - 1
compiler/aasm.pas

@@ -310,9 +310,15 @@ uses
     constructor tai.init;
       begin
 {$ifdef GDB}
+  {$ifdef NEWINPUT}
+         infile:=pointer(current_module^.sourcefiles.get_file(aktfilepos.fileindex));
+         if assigned(infile) then
+           line:=aktfilepos.line;
+  {$else}
          infile:=pointer(current_module^.current_inputfile);
          if assigned(infile) then
            line:=current_module^.current_inputfile^.line_no;
+  {$endif}
 {$endif GDB}
       end;
 
@@ -837,7 +843,10 @@ uses
 end.
 {
   $Log$
-  Revision 1.10  1998-06-08 22:59:41  peter
+  Revision 1.11  1998-07-07 11:19:50  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.10  1998/06/08 22:59:41  peter
     * smartlinking works for win32
     * some defines to exclude some compiler parts
 

+ 24 - 9
compiler/cgi386.pas

@@ -235,10 +235,15 @@ implementation
       begin
          oldcodegenerror:=codegenerror;
          oldswitches:=aktswitches;
+{$ifdef NEWINPUT}
+         oldpos:=aktfilepos;
+         aktfilepos:=p^.fileinfo;
+{$else}
          get_cur_file_pos(oldpos);
+         set_cur_file_pos(p^.fileinfo);
+{$endif NEWINPUT}
 
          codegenerror:=false;
-         set_cur_file_pos(p^.fileinfo);
          aktswitches:=p^.pragmas;
          if not(p^.error) then
            begin
@@ -249,7 +254,11 @@ implementation
          else
            codegenerror:=true;
          aktswitches:=oldswitches;
+{$ifdef NEWINPUT}
+         aktfilepos:=oldpos;
+{$else}
          set_cur_file_pos(oldpos);
+{$endif NEWINPUT}
       end;
 
 
@@ -331,8 +340,10 @@ implementation
 
       begin
          cleartempgen;
+{$ifndef NEWINPUT}
          oldis:=current_module^.current_inputfile;
          oldnr:=current_module^.current_inputfile^.line_no;
+{$endif}
          { when size optimization only count occurrence }
          if cs_littlesize in aktswitches then
            t_times:=1
@@ -398,19 +409,18 @@ implementation
                         for i:=1 to maxvarregs do
                           regvars[i]:=nil;
                         parasym:=false;
-{$ifdef tp}
+                      {$ifdef tp}
                         symtablestack^.foreach(searchregvars);
-{$else}
+                      {$else}
                         symtablestack^.foreach(@searchregvars);
-{$endif}
+                      {$endif}
                         { copy parameter into a register ? }
                         parasym:=true;
-{$ifdef tp}
+                      {$ifdef tp}
                         symtablestack^.next^.foreach(searchregvars);
-{$else}
+                      {$else}
                         symtablestack^.next^.foreach(@searchregvars);
-{$endif}
-
+                      {$endif}
                         { hold needed registers free }
                         for i:=maxvarregs downto maxvarregs-p^.registers32+1 do
                           regvars[i]:=nil;
@@ -504,14 +514,19 @@ implementation
            end;
          procinfo.aktproccode^.concatlist(exprasmlist);
          make_const_global:=false;
+{$ifndef NEWINPUT}
          current_module^.current_inputfile:=oldis;
          current_module^.current_inputfile^.line_no:=oldnr;
+{$endif}
       end;
 
 end.
 {
   $Log$
-  Revision 1.39  1998-06-12 10:32:23  pierre
+  Revision 1.40  1998-07-07 11:19:52  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.39  1998/06/12 10:32:23  pierre
     * column problem hopefully solved
     + C vars declaration changed
 

+ 16 - 9
compiler/cobjects.pas

@@ -43,15 +43,15 @@ unit cobjects;
     type
        pstring = ^string;
 
+       pfileposinfo = ^tfileposinfo;
        tfileposinfo = record
-         line : longint; { could be changed to abspos }
-         fileindex,column : word;
+         line      : longint;
+         column    : word;
+         fileindex : word;
        end;
-       pfileposinfo = ^tfileposinfo;
 
        { some help data types }
        pstringitem = ^tstringitem;
-
        tstringitem = record
           data : pstring;
           next : pstringitem;
@@ -59,7 +59,6 @@ unit cobjects;
        end;
 
        plinkedlist_item = ^tlinkedlist_item;
-
        tlinkedlist_item = object
           next,previous : plinkedlist_item;
           { does nothing }
@@ -68,16 +67,14 @@ unit cobjects;
        end;
 
        pstring_item = ^tstring_item;
-
        tstring_item = object(tlinkedlist_item)
           str : pstring;
           constructor init(const s : string);
           destructor done;virtual;
        end;
 
-       plinkedlist = ^tlinkedlist;
-
        { this implements a double linked list }
+       plinkedlist = ^tlinkedlist;
        tlinkedlist = object
           first,last : plinkedlist_item;
           constructor init;
@@ -146,6 +143,8 @@ unit cobjects;
           procedure clear;
        end;
 
+{$ifndef NEWINPUT}
+
        pbufferedfile = ^tbufferedfile;
 
        { this is implemented to allow buffered binary I/O }
@@ -238,6 +237,8 @@ unit cobjects;
            function getcrc : longint;
        end;
 
+{$endif NEWINPUT}
+
     { releases the string p and assignes nil to p }
     { if p=nil then freemem isn't called          }
     procedure stringdispose(var p : pstring);
@@ -737,6 +738,7 @@ end;
       end;
 
 
+{$ifndef NEWINPUT}
 
 {****************************************************************************
                                TBUFFEREDFILE
@@ -1119,10 +1121,15 @@ end;
            end;
       end;
 
+{$endif NEWINPUT}
+
 end.
 {
   $Log$
-  Revision 1.10  1998-07-01 15:26:59  peter
+  Revision 1.11  1998-07-07 11:19:54  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.10  1998/07/01 15:26:59  peter
     * better bufferfile.reset error handling
 
   Revision 1.9  1998/06/03 23:40:37  peter

+ 155 - 15
compiler/files.pas

@@ -38,14 +38,46 @@ unit files;
        extbufsize = 65535;
 {$else}
        maxunits = 128;
-       {$ifndef msdos}
-       extbufsize = 2000;
-       {$else}
-       extbufsize=512;
-       {$endif dpmi}
+       extbufsize=1024;
 {$endif}
 
     type
+{$ifdef NEWINPUT}
+       pinputfile = ^tinputfile;
+       tinputfile = object
+          path,name    : pstring;    { path and filename }
+          next         : pinputfile; { next file for reading }
+
+          savebufstart,              { save fields for scanner }
+          savebufsize,
+          savelastlinepos,
+          saveline_no      : longint;
+          saveinputbuffer,
+          saveinputpointer : pchar;
+
+          ref_count    : longint;    { to handle the browser refs }
+          ref_index    : longint;
+          ref_next     : pinputfile;
+
+          constructor init(const fn:string);
+          destructor done;
+       end;
+
+       pfilemanager = ^tfilemanager;
+       tfilemanager = object
+          files : pinputfile;
+          last_ref_index : longint;
+          constructor init;
+          destructor done;
+          procedure register_file(f : pinputfile);
+          function  get_file(l:longint) : pinputfile;
+          function  get_file_name(l :longint):string;
+          function  get_file_path(l :longint):string;
+       end;
+
+
+{$else NEWINPUT}
+
        { this isn't a text file, this is t-ext-file }
        { which means a extended file this files can }
        { be handled by a file manager               }
@@ -83,6 +115,8 @@ unit files;
           function  get_file(w : word) : pextfile;
        end;
 
+{$endif NEWINPUT}
+
     type
        tunitmap = array[0..maxunits-1] of pointer;
        punitmap = ^tunitmap;
@@ -118,7 +152,9 @@ unit files;
           linkstaticlibs,
           linkofiles    : tstringcontainer;
           used_units    : tlinkedlist;
+{$ifndef NEWINPUT}
           current_inputfile : pinputfile;
+{$endif}
           { used in firstpass for faster settings }
           current_index : word;
 
@@ -136,7 +172,7 @@ unit files;
 {$else}
           destructor special_done;virtual; { this is to be called only when compiling again }
 {$endif OLDPPU}
-          procedure setfilename(const _path,name:string);
+          procedure setfilename(const fn:string);
 {$ifndef OLDPPU}
           function  openppu:boolean;
 {$else}
@@ -253,6 +289,103 @@ unit files;
   uses
     dos,verbose,systems;
 
+{$ifdef NEWINPUT}
+
+{****************************************************************************
+                                  TINPUTFILE
+ ****************************************************************************}
+
+    constructor tinputfile.init(const fn:string);
+      var
+        p,n,e : string;
+      begin
+        FSplit(fn,p,n,e);
+        name:=stringdup(n+e);
+        path:=stringdup(p);
+        next:=nil;
+        ref_next:=nil;
+        ref_count:=0;
+        ref_index:=0;
+      end;
+
+
+    destructor tinputfile.done;
+      begin
+        stringdispose(path);
+        stringdispose(name);
+      end;
+
+
+{****************************************************************************
+                                TFILEMANAGER
+ ****************************************************************************}
+
+    constructor tfilemanager.init;
+      begin
+         files:=nil;
+         last_ref_index:=0;
+      end;
+
+
+    destructor tfilemanager.done;
+      var
+         hp : pinputfile;
+      begin
+         hp:=files;
+         while assigned(hp) do
+          begin
+            files:=files^.ref_next;
+            dispose(hp,done);
+            hp:=files;
+          end;
+         last_ref_index:=0;
+      end;
+
+
+    procedure tfilemanager.register_file(f : pinputfile);
+      begin
+         inc(last_ref_index);
+         f^.ref_next:=files;
+         f^.ref_index:=last_ref_index;
+         files:=f;
+      end;
+
+
+   function tfilemanager.get_file(l :longint) : pinputfile;
+     var
+        ff : pinputfile;
+     begin
+        ff:=files;
+        while assigned(ff) and (ff^.ref_index<>l) do
+         ff:=ff^.ref_next;
+        get_file:=ff;
+     end;
+
+
+   function tfilemanager.get_file_name(l :longint):string;
+     var
+       hp : pinputfile;
+     begin
+       hp:=get_file(l);
+       if assigned(hp) then
+        get_file_name:=hp^.name^
+       else
+        get_file_name:='';
+     end;
+
+
+   function tfilemanager.get_file_path(l :longint):string;
+     var
+       hp : pinputfile;
+     begin
+       hp:=get_file(l);
+       if assigned(hp) then
+        get_file_path:=hp^.path^
+       else
+        get_file_path:='';
+     end;
+
+{$else NEWINPUT}
 
 {****************************************************************************
                                   TFILE
@@ -359,22 +492,24 @@ unit files;
         get_file:=ff;
      end;
 
+{$endif NEWINPUT}
 
 {****************************************************************************
                                   TMODULE
  ****************************************************************************}
 
-    procedure tmodule.setfilename(const _path,name:string);
+    procedure tmodule.setfilename(const fn:string);
       var
-        s : string;
+        p,n,e,s : string;
       begin
+         fsplit(fn,p,n,e);
          stringdispose(objfilename);
          stringdispose(asmfilename);
          stringdispose(ppufilename);
          stringdispose(libfilename);
          stringdispose(path);
-         path:=stringdup(FixPath(_path));
-         s:=FixFileName(FixPath(_path)+name);
+         path:=stringdup(FixPath(p));
+         s:=FixFileName(FixPath(p)+n);
          objfilename:=stringdup(s+target_info.objext);
          asmfilename:=stringdup(s+target_info.asmext);
          ppufilename:=stringdup(s+target_info.unitext);
@@ -508,7 +643,7 @@ unit files;
               Found:=UnitExists(target_info.unitlibext);
               if Found then
                Begin
-                 SetFileName(SinglePathString,FileName);
+                 SetFileName(SinglePathString+FileName);
                  Found:=OpenPPU;
                End;
              end;
@@ -518,7 +653,7 @@ unit files;
               Found:=UnitExists(target_info.unitext);
               if Found then
                Begin
-                 SetFileName(SinglePathString,FileName);
+                 SetFileName(SinglePathString+FileName);
                  Found:=OpenPPU;
                End;
             end;
@@ -544,7 +679,7 @@ unit files;
                  sources_avail:=true;
                {Load Filenames when found}
                  mainsource:=StringDup(SinglePathString+FileName+Ext);
-                 SetFileName(SinglePathString,FileName);
+                 SetFileName(SinglePathString+FileName);
                end
               else
                sources_avail:=false;
@@ -826,14 +961,16 @@ unit files;
          libfilename:=nil;
          ppufilename:=nil;
          path:=nil;
-         setfilename(p,n);
+         setfilename(p+n);
          used_units.init;
          sourcefiles.init;
          linkofiles.init;
          linkstaticlibs.init;
          linksharedlibs.init;
          ppufile:=nil;
+{$ifndef NEWINPUT}
          current_inputfile:=nil;
+{$endif}
          map:=nil;
          symtable:=nil;
          flags:=0;
@@ -968,7 +1105,10 @@ unit files;
 end.
 {
   $Log$
-  Revision 1.29  1998-06-25 10:51:00  pierre
+  Revision 1.30  1998-07-07 11:19:55  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.29  1998/06/25 10:51:00  pierre
     * removed a remaining ifndef NEWPPU
       replaced by ifdef OLDPPU
     * added uf_finalize to ppu unit

+ 55 - 34
compiler/parser.pas

@@ -54,11 +54,6 @@ unit parser;
          { and no function header                        }
          testcurobject:=0;
 
-         { create error defintion }
-         generrordef:=new(perrordef,init);
-
-         symtablestack:=nil;
-
          { a long time, this was forgotten }
          aktprocsym:=nil;
 
@@ -104,8 +99,14 @@ unit parser;
          oldpreprocstack : ppreprocstack;
          oldorgpattern,oldprocprefix : string;
          old_block_type : tblock_type;
+{$ifdef NEWINPUT}
+         oldcurrent_scanner : pscannerfile;
+         oldaktfilepos : tfileposinfo;
+         oldlastlinepos : longint;
+{$else}
          oldcurrlinepos,
          oldlastlinepos,
+{$endif NEWINPUT}
          oldinputbuffer,
          oldinputpointer : pchar;
          olds_point,oldparse_only : boolean;
@@ -158,21 +159,26 @@ unit parser;
           end;
 
          { save scanner state }
-         oldmacros:=macros;
-         oldpattern:=pattern;
-         oldtoken:=token;
-         oldtokenpos:=tokenpos;
-         oldorgpattern:=orgpattern;
-         old_block_type:=block_type;
+{$ifdef NEWINPUT}
+         oldaktfilepos:=aktfilepos;
+         oldcurrent_scanner:=current_scanner;
+{$else}
+         oldcurrlinepos:=currlinepos;
          oldpreprocstack:=preprocstack;
-
          oldinputbuffer:=inputbuffer;
          oldinputpointer:=inputpointer;
-         oldcurrlinepos:=currlinepos;
          oldlastlinepos:=lastlinepos;
          olds_point:=s_point;
-         oldc:=c;
          oldcomment_level:=comment_level;
+{$endif}
+         oldc:=c;
+         oldpattern:=pattern;
+         oldtoken:=token;
+         oldtokenpos:=tokenpos;
+         oldorgpattern:=orgpattern;
+         old_block_type:=block_type;
+
+         oldmacros:=macros;
 
          oldnextlabelnr:=nextlabelnr;
          oldparse_only:=parse_only;
@@ -198,10 +204,6 @@ unit parser;
          oldoptprocessor:=aktoptprocessor;
          oldasmmode:=aktasmmode;
 
-         Message1(parser_i_compiling,filename);
-
-         InitScanner(filename);
-
        { Load current state from the init values }
          aktswitches:=initswitches;
          aktpackrecords:=initpackrecords;
@@ -219,15 +221,24 @@ unit parser;
          default_macros;
 
        { startup scanner }
+{$ifdef NEWINPUT}
+         current_scanner:=new(pscannerfile,Init(filename));
+         token:=current_scanner^.yylex;
+{$else}
+         InitScanner(filename);
          token:=yylex;
+{$endif}
+
+         Message1(parser_i_compiling,filename);
+
+       { global switches are read, so further changes aren't allowed }
+         current_module^.in_main:=true;
 
        { init code generator for a new module }
          codegen_newmodule;
 {$ifdef GDB}
          reset_gdb_info;
 {$endif GDB}
-       { global switches are read, so further changes aren't allowed }
-         current_module^.in_main:=true;
 
        { Handle things which need to be once }
          if (compile_level=1) then
@@ -313,14 +324,12 @@ done:
 {$ifdef GDB}
          reset_gdb_info;
 {$endif GDB}
+
          { restore symtable state }
-{$ifdef UseBrowser}
          if (compile_level>1) then
-{ we want to keep the current symtablestack }
-{$endif UseBrowser}
            begin
-              refsymtable:=oldrefsymtable;
-              symtablestack:=oldsymtablestack;
+             refsymtable:=oldrefsymtable;
+             symtablestack:=oldsymtablestack;
            end;
 
          procprefix:=oldprocprefix;
@@ -340,33 +349,42 @@ done:
               dispose(current_module^.ppufile,done);
               current_module^.ppufile:=nil;
            end;
-         { restore scanner state }
-         pattern:=oldpattern;
-         token:=oldtoken;
-         tokenpos:=oldtokenpos;
-         orgpattern:=oldorgpattern;
-         block_type:=old_block_type;
 
          { call donescanner before restoring preprocstack, because }
          { donescanner tests for a empty preprocstack              }
          { and can also check for unused macros                    }
+{$ifdef NEWINPUT}
+         dispose(current_scanner,done);
+{$else}
          donescanner(current_module^.compiled);
+{$endif}
          dispose(macros,done);
-         macros:=oldmacros;
 
          { restore scanner }
+{$ifdef NEWINPUT}
+         aktfilepos:=oldaktfilepos;
+         current_scanner:=oldcurrent_scanner;
+{$else}
          preprocstack:=oldpreprocstack;
          inputbuffer:=oldinputbuffer;
          inputpointer:=oldinputpointer;
          lastlinepos:=oldlastlinepos;
          currlinepos:=oldcurrlinepos;
          s_point:=olds_point;
-         c:=oldc;
          comment_level:=oldcomment_level;
+{$endif}
+         c:=oldc;
+         pattern:=oldpattern;
+         token:=oldtoken;
+         tokenpos:=oldtokenpos;
+         orgpattern:=oldorgpattern;
+         block_type:=old_block_type;
 
          nextlabelnr:=oldnextlabelnr;
          parse_only:=oldparse_only;
 
+         macros:=oldmacros;
+
          { restore asmlists }
          exprasmlist:=oldexprasmlist;
          datasegment:=olddatasegment;
@@ -414,7 +432,10 @@ done:
 end.
 {
   $Log$
-  Revision 1.28  1998-06-25 11:15:33  pierre
+  Revision 1.29  1998-07-07 11:19:59  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.28  1998/06/25 11:15:33  pierre
     * ppu files where not closed in newppu !!
       second compilation was impossible due to too many opened files
       (not visible in 'make cycle' as we remove all the ppu files)

+ 28 - 5
compiler/pass_1.pas

@@ -1825,7 +1825,8 @@ unit pass_1;
 
          if (p^.left^.resulttype^.deftype=stringdef) and (assigned(p^.right^.resulttype)) then
           begin
-            if not (p^.right^.resulttype^.deftype in [stringdef,orddef]) then
+            if not ((p^.right^.resulttype^.deftype=stringdef) or
+                    ((p^.right^.resulttype^.deftype=orddef) {and (porddef(p^.right^.resulttype)^.typ=uchar)})) then
              begin
                p^.right:=gentypeconvnode(p^.right,p^.left^.resulttype);
                firstpass(p^.right);
@@ -3724,7 +3725,7 @@ unit pass_1;
                       { check type }
                       if (p^.left^.resulttype^.deftype in [enumdef,pointerdef]) or
                          ((p^.left^.resulttype^.deftype=orddef) and
-                          (porddef(p^.left^.resulttype)^.typ in [bool8bit,u8bit,s8bit,
+                          (porddef(p^.left^.resulttype)^.typ in [uchar,bool8bit,u8bit,s8bit,
                              bool16bit,u16bit,s16bit,bool32bit,u32bit,s32bit])) then
                         begin
                            { two paras ? }
@@ -4296,13 +4297,20 @@ unit pass_1;
                      (hp^.left^.treetype<>labeln) then
                      begin
                         { use correct line number }
+{$ifdef NEWINPUT}
+                        aktfilepos:=hp^.left^.fileinfo;
+{$else}
                         set_current_file_line(hp^.left);
+{$endif}
                         disposetree(hp^.left);
                         hp^.left:=nil;
                         Message(cg_w_unreachable_code);
-
                         { old lines }
-                        set_current_file_line(hp^.right);
+{$ifdef NEWINPUT}
+                        aktfilepos:=hp^.right^.fileinfo;
+{$else}
+                        set_current_file_line(hp^.left);
+{$endif}
                      end;
                 end;
               if assigned(hp^.right) then
@@ -4974,7 +4982,11 @@ unit pass_1;
 {$endif extdebug}
          { if we save there the whole stuff, }
          { line numbers become more correct  }
+{$ifdef NEWINPUT}
+         oldpos:=aktfilepos;
+{$else}
          get_cur_file_pos(oldpos);
+{$endif NEWINPUT}
          oldcodegenerror:=codegenerror;
          oldswitches:=aktswitches;
 {$ifdef extdebug}
@@ -4991,7 +5003,11 @@ unit pass_1;
 {$endif extdebug}
 
          codegenerror:=false;
+{$ifdef NEWINPUT}
+         aktfilepos:=p^.fileinfo;
+{$else}
          set_cur_file_pos(p^.fileinfo);
+{$endif NEWINPUT}
          aktswitches:=p^.pragmas;
 
          if not(p^.error) then
@@ -5019,7 +5035,11 @@ unit pass_1;
            inc(p^.firstpasscount);
 {$endif extdebug}
          aktswitches:=oldswitches;
+{$ifdef NEWINPUT}
+         aktfilepos:=oldpos;
+{$else}
          set_cur_file_pos(oldpos);
+{$endif NEWINPUT}
       end;
 
     function do_firstpass(var p : ptree) : boolean;
@@ -5044,7 +5064,10 @@ unit pass_1;
 end.
 {
   $Log$
-  Revision 1.35  1998-06-25 14:04:19  peter
+  Revision 1.36  1998-07-07 11:20:00  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.35  1998/06/25 14:04:19  peter
     + internal inc/dec
 
   Revision 1.34  1998/06/25 08:48:14  florian

+ 10 - 3
compiler/pbase.pas

@@ -69,7 +69,7 @@ unit pbase;
     procedure consume(i : ttoken);
 
     function tokenstring(i : ttoken) : string;
-    
+
     { consumes all tokens til atoken (for error recovering }
     procedure consume_all_until(atoken : ttoken);
 
@@ -97,7 +97,11 @@ unit pbase;
       procedure syntaxerror(s : string);
 
         begin
+{$ifdef NEWINPUT}
+           Message2(scan_f_syn_expected,tostr(aktfilepos.column),s);
+{$else}
            Message2(scan_f_syn_expected,tostr(get_current_col),s);
+{$endif}
         end;
 
       { This is changed since I changed the order of token
@@ -151,7 +155,7 @@ unit pbase;
            begin
              if token=_END then
                 last_endtoken_filepos:=tokenpos;
-             token:=yylex;
+             token:={$ifdef NEWINPUT}current_scanner^.{$endif}yylex;
            end;
       end;
 
@@ -225,7 +229,10 @@ end.
 
 {
   $Log$
-  Revision 1.10  1998-06-05 14:37:31  pierre
+  Revision 1.11  1998-07-07 11:20:02  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.10  1998/06/05 14:37:31  pierre
     * fixes for inline for operators
     * inline procedure more correctly restricted
 

+ 30 - 5
compiler/pmodules.pas

@@ -254,11 +254,18 @@ unit pmodules;
               Message1(unit_f_cant_compile_unit,current_module^.modulename^)
              else
               begin
+{$ifdef NEWINPUT}
+                current_scanner^.close;
+                compile(current_module^.mainsource^,compile_system);
+                if (not old_current_module^.compiled) then
+                 current_scanner^.reopen;
+{$else}
                 if assigned(old_current_module^.current_inputfile) then
                  old_current_module^.current_inputfile^.tempclose;
                 compile(current_module^.mainsource^,compile_system);
                 if (not old_current_module^.compiled) and assigned(old_current_module^.current_inputfile) then
                  old_current_module^.current_inputfile^.tempreopen;
+{$endif}
               end;
            end
           else
@@ -743,10 +750,11 @@ unit pmodules;
 
       var
          { unitname : stringid; }
-         names:Tstringcontainer;
-         p : psymtable;
+         names  : Tstringcontainer;
+         p      : psymtable;
          unitst : punitsymtable;
          pu     : pused_unit;
+         i      : longint;
          s1,s2  : ^string; {Saves stack space}
       begin
          consume(_UNIT);
@@ -754,15 +762,26 @@ unit pmodules;
          if token=ID then
           begin
           { create filenames and unit name }
-             current_module^.SetFileName(current_module^.current_inputfile^.path^,current_module^.current_inputfile^.name^);
+{$ifdef NEWINPUT}
+             current_module^.SetFileName(current_scanner^.inputfile^.path^+current_scanner^.inputfile^.name^);
+{$else}
+             current_module^.SetFileName(current_module^.current_inputfile^.path^+current_module^.current_inputfile^.name^);
+{$endif}
              stringdispose(current_module^.modulename);
              current_module^.modulename:=stringdup(upper(pattern));
-
           { check for system unit }
              new(s1);
              new(s2);
              s1^:=upper(target_info.system_unit);
+{$ifdef NEWINPUT}
+             s2^:=upper(current_scanner^.inputfile^.name^);
+             { strip extension, there could only be one dot }
+             i:=pos('.',s2^);
+             if i>0 then
+              s2^:=Copy(s2^,1,i-1);
+{$else}
              s2^:=upper(current_module^.current_inputfile^.name^);
+{$endif}
              if (cs_compilesystem in aktswitches)  then
               begin
                 if (cs_check_unit_name in aktswitches) and
@@ -788,6 +807,9 @@ unit pmodules;
          consume(SEMICOLON);
          consume(_INTERFACE);
 
+         { update status }
+         status.currentmodule:=current_module^.modulename^;
+
          { this should be placed after uses !!}
 {$ifndef UseNiceNames}
          procprefix:='_'+current_module^.modulename^+'$$';
@@ -1155,7 +1177,10 @@ unit pmodules;
 end.
 {
   $Log$
-  Revision 1.33  1998-06-25 11:15:34  pierre
+  Revision 1.34  1998-07-07 11:20:03  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.33  1998/06/25 11:15:34  pierre
     * ppu files where not closed in newppu !!
       second compilation was impossible due to too many opened files
       (not visible in 'make cycle' as we remove all the ppu files)

+ 8 - 1
compiler/pp.pas

@@ -246,8 +246,12 @@ begin
             end;
      end;
    {when the module is assigned, then the messagefile is also loaded}
+{$ifdef NEWINPUT}
+     Writeln('Compilation aborted at line ',aktfilepos.line);
+{$else}
      if assigned(current_module) and assigned(current_module^.current_inputfile) then
       Writeln('Compilation aborted at line ',current_module^.current_inputfile^.line_no);
+{$endif}
    end;
 end;
 
@@ -394,7 +398,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.18  1998-06-24 14:06:33  peter
+  Revision 1.19  1998-07-07 11:20:04  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.18  1998/06/24 14:06:33  peter
     * fixed the name changes
 
   Revision 1.17  1998/06/23 08:59:22  daniel

+ 76 - 74
compiler/ra386att.pas

@@ -324,12 +324,10 @@ const
     token := AS_NONE;
     { while space and tab , continue scan... }
     while c in [' ',#9] do
-     c:=asmgetchar;
+     c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
     { Possiblities for first token in a statement:                }
     {   Local Label, Label, Directive, Prefix or Opcode....       }
-    tokenpos.line:=current_module^.current_inputfile^.line_no;
-    tokenpos.column:=get_file_col;
-    tokenpos.fileindex:=current_module^.current_index;
+    {$ifdef NEWINPUT}current_scanner^.{$endif}gettokenpos;
     if firsttoken and not (c in [newline,#13,'{',';']) then
     begin
       firsttoken := FALSE;
@@ -338,11 +336,11 @@ const
       begin
         actasmpattern := c;
         { Let us point to the next character }
-        c := asmgetchar;
+        c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
         while c in ['A'..'Z','a'..'z','0'..'9','_','$'] do
         begin
          actasmpattern := actasmpattern + c;
-         c := asmgetchar;
+         c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
         end;
 
         { this is a local label... }
@@ -353,7 +351,7 @@ const
           { delete .L }
           delete(actasmpattern,1,2);
           { point to next character ... }
-          c := asmgetchar;
+          c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
           exit;
         end
         { must be a directive }
@@ -371,7 +369,7 @@ const
         end;
       end; { endif }
 
-
+{$ifndef NEWINPUT}
       if c='/' then
         begin
            c:=asmgetchar;
@@ -389,11 +387,13 @@ const
            else
              Message(assem_e_slash_at_begin_of_line_not_allowed);
         end;
+{$endif}
+
       { only opcodes and global labels are allowed now. }
       while c in ['A'..'Z','a'..'z','0'..'9','_'] do
       begin
          actasmpattern := actasmpattern + c;
-         c := asmgetchar;
+         c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
       end;
 
       if c = ':' then
@@ -405,7 +405,7 @@ const
            for labels !! (PM) }
            token := AS_LABEL;
            { let us point to the next character }
-           c := asmgetchar;
+           c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
            gettoken := token;
            exit;
       end;
@@ -438,11 +438,11 @@ const
                 {                - directive.                                     }
                             begin
                              actasmpattern := c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              while c in  ['A'..'Z','a'..'z','0'..'9','_','$'] do
                              begin
                                actasmpattern := actasmpattern + c;
-                               c := asmgetchar;
+                               c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              end;
                              is_asmdirective(actasmpattern,token);
                              { if directive }
@@ -459,11 +459,11 @@ const
       { identifier, register, opcode, prefix or directive }
          '_','A'..'Z','a'..'z': begin
                              actasmpattern := c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              while c in  ['A'..'Z','a'..'z','0'..'9','_','$'] do
                              begin
                                actasmpattern := actasmpattern + c;
-                               c := asmgetchar;
+                               c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              end;
                              { pascal is not case sensitive!    }
                              { therefore variables which are    }
@@ -498,16 +498,16 @@ const
                              exit;
                           end;
            '&':       begin
-                         c:=asmgetchar;
+                         c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                          gettoken := AS_AND;
                       end;
            { character }
            '''' :     begin
-                         c:=asmgetchar;
+                         c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                          if c = '\' then
                          Begin
                            { escape sequence }
-                           c:=asmgetchar;
+                           c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                            case c of
                          newline: Message(scan_f_string_exceeds_line);
                              't': actasmpattern:=#09;
@@ -521,8 +521,8 @@ const
                              '0'..'7':
                                 begin
                                    temp:=c;
-                                   temp:=temp+asmgetchar;
-                                   temp:=temp+asmgetchar;
+                                   temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
+                                   temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                    val(octaltodec(temp),value,code);
                                    if (code <> 0) then
                                     Message1(assem_e_error_in_octal_const,temp);
@@ -531,8 +531,8 @@ const
                              { hexadecimal number }
                              'x':
                                  begin
-                                   temp:=asmgetchar;
-                                   temp:=temp+asmgetchar;
+                                   temp:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
+                                   temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                    val(hextodec(temp),value,code);
                                    if (code <> 0) then
                                     Message1(assem_e_error_in_hex_const,temp);
@@ -549,7 +549,7 @@ const
                            actasmpattern:=c;
 
                          gettoken := AS_STRING;
-                         c:=asmgetchar;
+                         c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                          exit;
 
                       end;
@@ -559,11 +559,11 @@ const
                          actasmpattern:='';
                          while true do
                          Begin
-                           c:=asmgetchar;
+                           c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                            case c of
                             '\': Begin
                                   { escape sequences }
-                                  c:=asmgetchar;
+                                  c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                   case c of
                                    newline: Message(scan_f_string_exceeds_line);
                                    't': actasmpattern:=actasmpattern+#09;
@@ -577,8 +577,8 @@ const
                                    '0'..'7':
                                       begin
                                            temp:=c;
-                                           temp:=temp+asmgetchar;
-                                           temp:=temp+asmgetchar;
+                                           temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
+                                           temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                            val(octaltodec(temp),value,code);
                                            if (code <> 0) then
                                             Message1(assem_e_error_in_octal_const,temp);
@@ -587,8 +587,8 @@ const
                                    { hexadecimal number }
                                    'x':
                                      begin
-                                       temp:=asmgetchar;
-                                       temp:=temp+asmgetchar;
+                                       temp:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
+                                       temp:=temp+{$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                        val(hextodec(temp),value,code);
                                        if (code <> 0) then
                                         Message1(assem_e_error_in_hex_const,temp);
@@ -602,7 +602,7 @@ const
                                    end; { end case }
                                  end;
                             '"': begin
-                                  c:=asmgetchar;
+                                  c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                   break;
                                  end;
                             newline: Message(scan_f_string_exceeds_line);
@@ -616,91 +616,91 @@ const
                  end;
            '$' :  begin
                    gettoken := AS_DOLLAR;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                   end;
            ',' : begin
                    gettoken := AS_COMMA;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '<' : begin
                    gettoken := AS_SHL;
-                   c := asmgetchar;
+                   c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    if c = '<' then
-                     c := asmgetchar;
+                     c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '>' : begin
                    gettoken := AS_SHL;
-                   c := asmgetchar;
+                   c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    if c = '>' then
-                     c := asmgetchar;
+                     c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '|' : begin
                    gettoken := AS_OR;
-                   c := asmgetchar;
+                   c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '^' : begin
                   gettoken := AS_XOR;
-                  c := asmgetchar;
+                  c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                   exit;
                  end;
            '!' : begin
                   Message(assem_e_nor_not_supported);
-                  c := asmgetchar;
+                  c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                   gettoken := AS_NONE;
                   exit;
                  end;
            '(' : begin
                    gettoken := AS_LPAREN;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            ')' : begin
                    gettoken := AS_RPAREN;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            ':' : begin
                    gettoken := AS_COLON;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '+' : begin
                    gettoken := AS_PLUS;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '-' : begin
                    gettoken := AS_MINUS;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '*' : begin
                    gettoken := AS_STAR;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '/' : begin
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    { att styled comment }
                    if c='/' then
                      begin
                         repeat
-                           c:=asmgetchar;
+                           c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         until c=newline;
                         firsttoken := TRUE;
                         gettoken:=AS_SEPARATOR;
-                        c:=asmgetchar;
+                        c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         exit;
                      end
                    else
                      begin
                         gettoken := AS_SLASH;
-                        c:=asmgetchar;
+                        c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         exit;
                      end;
                  end;
@@ -709,29 +709,29 @@ const
            { for the moment.         }
            '%' : begin
                      actasmpattern := c;
-                     c:=asmgetchar;
+                     c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                      while c in ['a'..'z','A'..'Z','0'..'9'] do
                      Begin
                         actasmpattern := actasmpattern + c;
-                        c:=asmgetchar;
+                        c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                      end;
                      token := AS_NONE;
                      uppervar(actasmpattern);
                      if (actasmpattern = '%ST') and (c='(') then
                      Begin
                         actasmpattern:=actasmpattern+c;
-                        c:=asmgetchar;
+                        c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         if c in ['0'..'9'] then
                           actasmpattern := actasmpattern + c
                         else
                           Message(assem_e_invalid_fpu_register);
-                        c:=asmgetchar;
+                        c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         if c <> ')' then
                           Message(assem_e_invalid_fpu_register)
                         else
                         Begin
                           actasmpattern := actasmpattern + c;
-                          c:=asmgetchar; { let us point to next character. }
+                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar; { let us point to next character. }
                         end;
                      end;
                      is_register(actasmpattern, token);
@@ -747,11 +747,11 @@ const
            { integer number }
            '1'..'9': begin
                         actasmpattern := c;
-                        c := asmgetchar;
+                        c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         while c in ['0'..'9'] do
                           Begin
                              actasmpattern := actasmpattern + c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           end;
                         gettoken := AS_INTNUM;
                         exit;
@@ -759,57 +759,57 @@ const
            '0': begin
                 { octal,hexa,real or binary number. }
                  actasmpattern := c;
-                 c:=asmgetchar;
+                 c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                  case upcase(c) of
                    { binary }
                    'B': Begin
-                          c:=asmgetchar;
+                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           while c in ['0','1'] do
                           Begin
                             actasmpattern := actasmpattern + c;
-                            c := asmgetchar;
+                            c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           end;
                           gettoken := AS_BINNUM;
                           exit;
                         end;
                    { real }
                    'D': Begin
-                          c:=asmgetchar;
+                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           { get ridd of the 0d }
                           if (c='+') or (c='-') then
                             begin
                                actasmpattern:=c;
-                               c:=asmgetchar;
+                               c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                             end
                           else
                             actasmpattern:='';
                         while c in ['0'..'9'] do
                           Begin
                              actasmpattern := actasmpattern + c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           end;
                         if c='.' then
                           begin
                              actasmpattern := actasmpattern + c;
-                             c:=asmgetchar;
+                             c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              while c in ['0'..'9'] do
                                Begin
                                   actasmpattern := actasmpattern + c;
-                                  c:= asmgetchar;
+                                  c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                end;
                              if upcase(c) = 'E' then
                                begin
                                   actasmpattern := actasmpattern + c;
-                                  c:=asmgetchar;
+                                  c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                   if (c = '+') or (c = '-') then
                                     begin
                                        actasmpattern := actasmpattern + c;
-                                       c:=asmgetchar;
+                                       c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                     end;
                                   while c in ['0'..'9'] do
                                     Begin
                                        actasmpattern := actasmpattern + c;
-                                       c:= asmgetchar;
+                                       c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                     end;
                                end;
                              gettoken := AS_REALNUM;
@@ -820,11 +820,11 @@ const
                         end;
                    { hexadecimal }
                    'X': Begin
-                          c:=asmgetchar;
+                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           while c in ['0'..'9','a'..'f','A'..'F'] do
                           Begin
                             actasmpattern := actasmpattern + c;
-                            c := asmgetchar;
+                            c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           end;
                           gettoken := AS_HEXNUM;
                           exit;
@@ -835,7 +835,7 @@ const
                                while c in ['0'..'7'] do
                                Begin
                                  actasmpattern := actasmpattern + c;
-                                 c := asmgetchar;
+                                 c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                end;
                                gettoken := AS_OCTALNUM;
                                exit;
@@ -847,10 +847,9 @@ const
                       end;
                    end; { end case }
                 end;
-
-         '{',#13,newline,';' : begin
+    '{',#13,newline,';' : begin
                             { the comment is read by asmgetchar }
-                            c:=asmgetchar;
+                            c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                             firsttoken := TRUE;
                             gettoken:=AS_SEPARATOR;
                            end;
@@ -3415,7 +3414,7 @@ const
     store_p:=p;
     { setup label linked list }
     labellist.init;
-    c:=asmgetchar;
+    c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
     actasmtoken:=gettoken;
     while actasmtoken<>AS_END do
     Begin
@@ -3691,7 +3690,10 @@ end.
 
 {
   $Log$
-  Revision 1.2  1998-06-24 14:06:36  peter
+  Revision 1.3  1998-07-07 11:20:07  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.2  1998/06/24 14:06:36  peter
     * fixed the name changes
 
   Revision 1.1  1998/06/23 14:00:17  peter

+ 9 - 8
compiler/ra386dir.pas

@@ -73,13 +73,11 @@ unit Ra386dir;
          retstr:=upper(tostr(procinfo.retoffset)+'('+att_reg2str[procinfo.framepointer]+')')
        else
          retstr:='';
-         c:=asmgetchar;
+         c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
          code:=new(paasmoutput,init);
          while not(ende) do
            begin
-              tokenpos.line:=current_module^.current_inputfile^.line_no;
-              tokenpos.column:=get_file_col;
-              tokenpos.fileindex:=current_module^.current_index;
+              {$ifdef NEWINPUT}current_scanner^.{$endif}gettokenpos;
               case c of
                  'A'..'Z','a'..'z','_' : begin
                       hs:='';
@@ -90,7 +88,7 @@ unit Ra386dir;
                         begin
                            inc(byte(hs[0]));
                            hs[length(hs)]:=c;
-                           c:=asmgetchar;
+                           c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                         end;
                       if upper(hs)='END' then
                          ende:=true
@@ -221,14 +219,14 @@ unit Ra386dir;
                       if pos(retstr,s) > 0 then
                         procinfo.funcret_is_valid:=true;
                      writeasmline;
-                     c:=asmgetchar;
+                     c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    end;
              #26 : Message(scan_f_end_of_file);
              else
                begin
                  inc(byte(s[0]));
                  s[length(s)]:=c;
-                 c:=asmgetchar;
+                 c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                end;
            end;
          end;
@@ -239,7 +237,10 @@ unit Ra386dir;
 end.
 {
   $Log$
-  Revision 1.2  1998-06-24 14:06:37  peter
+  Revision 1.3  1998-07-07 11:20:08  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.2  1998/06/24 14:06:37  peter
     * fixed the name changes
 
   Revision 1.1  1998/06/23 14:00:18  peter

+ 41 - 46
compiler/ra386int.pas

@@ -42,12 +42,6 @@ Unit Ra386int;
 {    table will be completed.                                        }
 { o Add imul,shld and shrd support with references and CL            }
 {    i386.pas requires to be updated to do this.                     }
-{ o Support for (* *) tp styled comments, this support should be     }
-{   added in asmgetchar in scanner.pas (it cannot be implemented     }
-{   here without causing errors such as in :                         }
-{   (* "openbrace" AComment *)                                       }
-{   (presently an infinite loop will be created if a (* styled       }
-{    comment is found).                                              }
 { o Bugfix of ao_imm8s for IMUL. (Currently the 3 operand imul will  }
 {   be considered as invalid because I use ao_imm8 and the table     }
 {   uses ao_imm8s).                                                  }
@@ -338,12 +332,10 @@ var
     token := AS_NONE;
     { while space and tab , continue scan... }
     while (c in [' ',#9]) do
-      c := asmgetchar;
+      c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
     { Possiblities for first token in a statement:                }
     {   Local Label, Label, Directive, Prefix or Opcode....       }
-    tokenpos.line:=current_module^.current_inputfile^.line_no;
-    tokenpos.column:=get_file_col;
-    tokenpos.fileindex:=current_module^.current_index;
+    {$ifdef NEWINPUT}current_scanner^.{$endif}gettokenpos;
     if firsttoken and not (c in [newline,#13,'{',';']) then
     begin
       firsttoken := FALSE;
@@ -351,7 +343,7 @@ var
       begin
         token := AS_LLABEL;   { this is a local label }
         { Let us point to the next character }
-        c := asmgetchar;
+        c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
       end;
 
 
@@ -361,7 +353,7 @@ var
          { if there is an at_sign, then this must absolutely be a label }
          if c = '@' then forcelabel:=TRUE;
          actasmpattern := actasmpattern + c;
-         c := asmgetchar;
+         c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
       end;
 
       uppervar(actasmpattern);
@@ -373,7 +365,7 @@ var
              AS_LLABEL: ; { do nothing }
            end; { end case }
            { let us point to the next character }
-           c := asmgetchar;
+           c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
            gettoken := token;
            exit;
       end;
@@ -412,11 +404,11 @@ var
                 {                - @Result, @Code or @Data special variables.     }
                             begin
                              actasmpattern := c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              while c in  ['A'..'Z','a'..'z','0'..'9','_','@'] do
                              begin
                                actasmpattern := actasmpattern + c;
-                               c := asmgetchar;
+                               c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              end;
                              uppervar(actasmpattern);
                              gettoken := AS_ID;
@@ -425,11 +417,11 @@ var
       { identifier, register, opcode, prefix or directive }
          'A'..'Z','a'..'z','_': begin
                              actasmpattern := c;
-                             c:= asmgetchar;
+                             c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              while c in  ['A'..'Z','a'..'z','0'..'9','_'] do
                              begin
                                actasmpattern := actasmpattern + c;
-                               c := asmgetchar;
+                               c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                              end;
                              uppervar(actasmpattern);
 
@@ -460,7 +452,7 @@ var
            { override operator... not supported }
            '&':       begin
                          Message(assem_w_override_op_not_supported);
-                         c:=asmgetchar;
+                         c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                          gettoken := AS_NONE;
                       end;
            { string or character }
@@ -471,7 +463,7 @@ var
                          begin
                            if c = '''' then
                            begin
-                              c:=asmgetchar;
+                              c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                               if c=newline then
                               begin
                                  Message(scan_f_string_exceeds_line);
@@ -480,11 +472,11 @@ var
                               repeat
                                   if c=''''then
                                    begin
-                                       c:=asmgetchar;
+                                       c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                        if c='''' then
                                         begin
                                                actasmpattern:=actasmpattern+'''';
-                                               c:=asmgetchar;
+                                               c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                                if c=newline then
                                                begin
                                                     Message(scan_f_string_exceeds_line);
@@ -496,7 +488,7 @@ var
                                    else
                                    begin
                                           actasmpattern:=actasmpattern+c;
-                                          c:=asmgetchar;
+                                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                           if c=newline then
                                             begin
                                                Message(scan_f_string_exceeds_line);
@@ -519,7 +511,7 @@ var
                          begin
                            if c = '"' then
                            begin
-                              c:=asmgetchar;
+                              c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                               if c=newline then
                               begin
                                  Message(scan_f_string_exceeds_line);
@@ -528,11 +520,11 @@ var
                               repeat
                                   if c='"'then
                                    begin
-                                       c:=asmgetchar;
+                                       c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                        if c='"' then
                                         begin
                                                actasmpattern:=actasmpattern+'"';
-                                               c:=asmgetchar;
+                                               c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                                if c=newline then
                                                begin
                                                   Message(scan_f_string_exceeds_line);
@@ -545,7 +537,7 @@ var
                                   else
                                    begin
                                           actasmpattern:=actasmpattern+c;
-                                          c:=asmgetchar;
+                                          c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                           if c=newline then
                                             begin
                                                Message(scan_f_string_exceeds_line);
@@ -561,68 +553,68 @@ var
                    exit;
                  end;
            '$' :  begin
-                    c:=asmgetchar;
+                    c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                     while c in ['0'..'9','A'..'F','a'..'f'] do
                     begin
                       actasmpattern := actasmpattern + c;
-                      c := asmgetchar;
+                      c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                     end;
                    gettoken := AS_HEXNUM;
                    exit;
                   end;
            ',' : begin
                    gettoken := AS_COMMA;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '[' : begin
                    gettoken := AS_LBRACKET;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            ']' : begin
                    gettoken := AS_RBRACKET;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '(' : begin
                    gettoken := AS_LPAREN;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            ')' : begin
                    gettoken := AS_RPAREN;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            ':' : begin
                    gettoken := AS_COLON;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '.' : begin
                    gettoken := AS_DOT;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '+' : begin
                    gettoken := AS_PLUS;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '-' : begin
                    gettoken := AS_MINUS;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '*' : begin
                    gettoken := AS_STAR;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '/' : begin
                    gettoken := AS_SLASH;
-                   c:=asmgetchar;
+                   c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                    exit;
                  end;
            '0'..'9': begin
@@ -630,12 +622,12 @@ var
                           { if so, then we use a default value instead.}
                           errorflag := false;
                           actasmpattern := c;
-                          c := asmgetchar;
+                          c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           { Get the possible characters }
                           while c in ['0'..'9','A'..'F','a'..'f'] do
                           begin
                             actasmpattern := actasmpattern + c;
-                            c:= asmgetchar;
+                            c:= {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                           end;
                           { Get ending character }
                           uppervar(actasmpattern);
@@ -671,7 +663,7 @@ var
                                      if errorflag then
                                         actasmpattern := '0';
                                       gettoken := AS_OCTALNUM;
-                                      c := asmgetchar;
+                                      c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                       exit;
                                     end;
                               'H': Begin
@@ -685,7 +677,7 @@ var
                                      if errorflag then
                                         actasmpattern := '0';
                                      gettoken := AS_HEXNUM;
-                                     c := asmgetchar;
+                                     c := {$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                                      exit;
                                    end;
                               else { must be an integer number }
@@ -706,7 +698,7 @@ var
                       end; { end if }
                      end;
     ';','{',#13,newline : begin
-                            c:=asmgetchar;
+                            c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
                             firsttoken := TRUE;
                             gettoken:=AS_SEPARATOR;
                            end;
@@ -3261,7 +3253,7 @@ var
     p:=new(paasmoutput,init);
     { setup label linked list }
     labellist.init;
-    c:=asmgetchar;
+    c:={$ifdef NEWINPUT}current_scanner^.{$endif}asmgetchar;
     actasmtoken:=gettoken;
     while actasmtoken<>AS_END do
     Begin
@@ -3376,7 +3368,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.2  1998-06-24 14:06:38  peter
+  Revision 1.3  1998-07-07 11:20:09  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.2  1998/06/24 14:06:38  peter
     * fixed the name changes
 
   Revision 1.1  1998/06/23 14:00:18  peter

+ 141 - 112
compiler/scandir.inc

@@ -86,7 +86,8 @@ const
       preprocpat    : string;
       preproc_token : ttoken;
 
-    function read_preproc : ttoken;
+{$ifndef NEWINPUT}
+    function readpreproc:ttoken;
       begin
          skipspace;
          case c of
@@ -94,74 +95,74 @@ const
         'a'..'z',
     '_','0'..'9' : begin
                      preprocpat:=readid;
-                     read_preproc:=ID;
+                     readpreproc:=ID;
                    end;
              '(' : begin
                      readchar;
-                     read_preproc:=LKLAMMER;
+                     readpreproc:=LKLAMMER;
                    end;
              ')' : begin
                      readchar;
-                     read_preproc:=RKLAMMER;
+                     readpreproc:=RKLAMMER;
                    end;
              '+' : begin
                      readchar;
-                     read_preproc:=PLUS;
+                     readpreproc:=PLUS;
                    end;
              '-' : begin
                      readchar;
-                     read_preproc:=MINUS;
+                     readpreproc:=MINUS;
                    end;
              '*' : begin
                      readchar;
-                     read_preproc:=STAR;
+                     readpreproc:=STAR;
                    end;
              '/' : begin
                      readchar;
-                     read_preproc:=SLASH;
+                     readpreproc:=SLASH;
                    end;
              '=' : begin
                      readchar;
-                     read_preproc:=EQUAL;
+                     readpreproc:=EQUAL;
                    end;
              '>' : begin
                      readchar;
                      if c='=' then
                       begin
                         readchar;
-                        read_preproc:=GTE;
+                        readpreproc:=GTE;
                       end
                      else
-                      read_preproc:=GT;
+                      readpreproc:=GT;
                    end;
              '<' : begin
                      readchar;
                      case c of
                       '>' : begin
                               readchar;
-                              read_preproc:=UNEQUAL;
+                              readpreproc:=UNEQUAL;
                             end;
                       '=' : begin
                               readchar;
-                              read_preproc:=LTE;
+                              readpreproc:=LTE;
                             end;
-                     else   read_preproc:=LT;
+                     else   readpreproc:=LT;
                      end;
                    end;
              #26 : Message(scan_f_end_of_file);
          else
           begin
-            read_preproc:=_EOF;
+            readpreproc:=_EOF;
           end;
          end;
       end;
-
+{$endif}
 
     procedure preproc_consume(t : ttoken);
       begin
-         if t<>preproc_token then
-          Message(scan_e_preproc_syntax_error);
-         preproc_token:=read_preproc;
+        if t<>preproc_token then
+         Message(scan_e_preproc_syntax_error);
+        preproc_token:={$ifdef NEWINPUT}current_scanner^.{$endif}readpreproc;
       end;
 
     function read_expr : string;forward;
@@ -342,19 +343,6 @@ const
 
 
     procedure dir_conditional(t:tdirectivetoken);
-
-       procedure newpreproc(isifdef,a:boolean;const s:string;w:tmsgconst);
-       begin
-         preprocstack:=new(ppreprocstack,init(isifdef,
-           ((preprocstack=nil) or preprocstack^.accept) and a,preprocstack));
-         preprocstack^.name:=s;
-         preprocstack^.line_nb:=current_module^.current_inputfile^.line_no;
-         if preprocstack^.accept then
-          Message2(w,preprocstack^.name,'accepted')
-         else
-          Message2(w,preprocstack^.name,'rejected');
-       end;
-
       var
         hs    : string;
         mac   : pmacrosym;
@@ -364,50 +352,37 @@ const
          begin
            case t of
    _DIR_ENDIF : begin
-                { we can always accept an ELSE }
-                  if assigned(preprocstack) then
-                   begin
-                     Message1(scan_c_endif_found,preprocstack^.name);
-                     if not preprocstack^.isifdef then
-                      popstack;
-                   end
-                  else
-                   Message(scan_e_endif_without_if);
-                { now pop the condition }
-                  if assigned(preprocstack) then
-                   begin
-                   { we only use $ifdef in the stack }
-                     if preprocstack^.isifdef then
-                      popstack
-                     else
-                      Message(scan_e_too_much_endifs);
-                   end
-                  else
-                   Message(scan_e_endif_without_if);
+                  {$ifdef NEWINPUT}current_scanner^.{$endif}poppreprocstack;
                 end;
     _DIR_ELSE : begin
-                  if assigned(preprocstack) then
-                   begin
-                     preprocstack:=new(ppreprocstack,init(false,
-                       not(preprocstack^.accept) and
-                       ((preprocstack^.next=nil) or (preprocstack^.next^.accept)),preprocstack));
-                     preprocstack^.line_nb:=current_module^.current_inputfile^.line_no;
-                     preprocstack^.name:=preprocstack^.next^.name;
-                     if preprocstack^.accept then
-                      Message2(scan_c_else_found,preprocstack^.name,'accepted')
-                     else
-                      Message2(scan_c_else_found,preprocstack^.name,'rejected');
-                   end
-                  else
-                   Message(scan_e_endif_without_if);
+                  {$ifdef NEWINPUT}current_scanner^.{$endif}elsepreprocstack;
                 end;
    _DIR_IFDEF : begin
+{$ifdef NEWINPUT}
+                  current_scanner^.skipspace;
+                  hs:=current_scanner^.readid;
+                  mac:=pmacrosym(macros^.search(hs));
+                  current_scanner^.addpreprocstack(assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
+{$else}
                   skipspace;
                   hs:=readid;
                   mac:=pmacrosym(macros^.search(hs));
-                  newpreproc(true,assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
+                  addpreprocstack(assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
+{$endif}
                 end;
    _DIR_IFOPT : begin
+{$ifdef NEWINPUT}
+                  current_scanner^.skipspace;
+                  hs:=current_scanner^.readid;
+                  if (length(hs)=1) and (c in ['-','+']) then
+                   begin
+                     found:=CheckSwitch(hs[1],c);
+                     current_scanner^.readchar; {read + or -}
+                   end
+                  else
+                   Message(scan_w_illegal_switch);
+                  current_scanner^.addpreprocstack(found,hs,scan_c_ifopt_found);
+{$else}
                   skipspace;
                   hs:=readid;
                   if (length(hs)=1) and (c in ['-','+']) then
@@ -417,23 +392,53 @@ const
                    end
                   else
                    Message(scan_w_illegal_switch);
-                  newpreproc(true,found,hs,scan_c_ifopt_found);
+                  addpreprocstack(found,hs,scan_c_ifopt_found);
+{$endif}
                 end;
       _DIR_IF : begin
+{$ifdef NEWINPUT}
+                  current_scanner^.skipspace;
+                  { start preproc expression scanner }
+                  preproc_token:=current_scanner^.readpreproc;
+                  hs:=read_expr;
+                  current_scanner^.addpreprocstack(hs<>'0',hs,scan_c_if_found);
+{$else}
                   skipspace;
                   { start preproc expression scanner }
-                  preproc_token:=read_preproc;
+                  preproc_token:=readpreproc;
                   hs:=read_expr;
-                  newpreproc(true,hs<>'0',hs,scan_c_if_found);
+                  addpreprocstack(hs<>'0',hs,scan_c_if_found);
+{$endif}
                 end;
   _DIR_IFNDEF : begin
+{$ifdef NEWINPUT}
+                  current_scanner^.skipspace;
+                  hs:=current_scanner^.readid;
+                  mac:=pmacrosym(macros^.search(hs));
+                  current_scanner^.addpreprocstack(not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
+{$else}
                   skipspace;
                   hs:=readid;
                   mac:=pmacrosym(macros^.search(hs));
-                  newpreproc(true,not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
+                  addpreprocstack(not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
+{$endif}
                 end;
            end;
          { accept the text ? }
+{$ifdef NEWINPUT}
+           if (current_scanner^.preprocstack=nil) or current_scanner^.preprocstack^.accept then
+            break
+           else
+            begin
+              Message(scan_c_skipping_until);
+              repeat
+                current_scanner^.skipuntildirective;
+                t:=Get_Directive(current_scanner^.readid);
+              until is_conditional(t);
+              Message1(scan_d_handling_switch,'$'+directive[t]);
+            end;
+         end;
+{$else}
            if (preprocstack=nil) or preprocstack^.accept then
             break
            else
@@ -445,6 +450,7 @@ const
               until is_conditional(t);
             end;
          end;
+{$endif}
       end;
 
 
@@ -454,9 +460,11 @@ const
         hs2,
         hs  : string;
         mac : pmacrosym;
+        macropos : longint;
+        macrobuffer : pmacrobuffer;
       begin
-        skipspace;
-        hs:=readid;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readid;
         mac:=pmacrosym(macros^.search(hs));
         if not assigned(mac) then
           begin
@@ -485,20 +493,21 @@ const
               Message(scan_e_keyword_cant_be_a_macro);
              pattern:=hs2;
            { !!!!!! handle macro params, need we this? }
-             skipspace;
+             {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
            { may be a macro? }
              if c=':' then
                begin
-                  readchar;
+                  {$ifdef NEWINPUT}current_scanner^.{$endif}readchar;
                   if c='=' then
                     begin
-                       { first char }
-                       readchar;
+                       new(macrobuffer);
                        macropos:=0;
+                       { first char }
+                       {$ifdef NEWINPUT}current_scanner^.{$endif}readchar;
                        while (c<>'}') do
                          begin
                             macrobuffer^[macropos]:=c;
-                            readchar;
+                            {$ifdef NEWINPUT}current_scanner^.{$endif}readchar;
                             if c=#26 then Message(scan_f_end_of_file);
                             inc(macropos);
                             if macropos>maxmacrolen then
@@ -512,6 +521,7 @@ const
                        mac^.buflen:=macropos;
                        { copy the text }
                        move(macrobuffer^,mac^.buftext^,macropos);
+                       dispose(macrobuffer);
                     end;
                end;
           end;
@@ -523,8 +533,8 @@ const
         hs  : string;
         mac : pmacrosym;
       begin
-        skipspace;
-        hs:=readid;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readid;
         mac:=pmacrosym(macros^.search(hs));
         if not assigned(mac) then
           begin
@@ -560,8 +570,8 @@ const
     _DIR_MESSAGE,
        _DIR_INFO : w:=scan_i_user_defined;
         end;
-        skipspace;
-        Message1(w,readcomment);
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        Message1(w,{$ifdef NEWINPUT}current_scanner^.{$endif}readcomment);
       end;
 
 
@@ -576,7 +586,7 @@ const
 {$endif}
    _DIR_SMARTLINK : sw:=cs_smartlink;
         end;
-        skipspace;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
         if c='-' then
          aktswitches:=aktswitches-[sw]
         else
@@ -593,12 +603,29 @@ const
         hp    : pinputfile;
         found : boolean;
       begin
-        skipspace;
-        hs:=readcomment;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readcomment;
         while (hs<>'') and (hs[length(hs)]=' ') do
          dec(byte(hs[0]));
         hs:=FixFileName(hs);
         fsplit(hs,path,name,ext);
+{$ifdef NEWINPUT}
+      { first look in the path of _d then currentmodule }
+        path:=search(hs,path+';'+current_scanner^.inputfile^.path^+';'+includesearchpath,found);
+      { shutdown current file }
+        current_scanner^.close;
+      { load new file }
+        hp:=new(pinputfile,init(path+name+ext));
+        current_scanner^.addfile(hp);
+        if not current_scanner^.open then
+         Message1(scan_f_cannot_open_includefile,hs);
+        status.currentsource:=current_scanner^.inputfile^.name^;
+        Message1(scan_u_start_include_file,current_scanner^.inputfile^.name^);
+        current_scanner^.reload;
+      { register for refs }
+        current_module^.sourcefiles.register_file(hp);
+        current_module^.current_index:=hp^.ref_index;
+{$else}
       { first look in the path of _d then currentmodule }
         path:=search(hs,path+';'+current_module^.current_inputfile^.path^+';'+includesearchpath,found);
         hp:=new(pinputfile,init(path,name,ext));
@@ -617,6 +644,7 @@ const
          end
         else
          Message1(scan_f_cannot_open_includefile,hs);
+{$endif NEWINPUT}
       end;
 
 
@@ -627,29 +655,28 @@ const
 
     procedure dir_linkobject(t:tdirectivetoken);
       begin
-        skipspace;
-        current_module^.linkofiles.insert(FixFileName(readstring));
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}readstring;
+        current_module^.linkofiles.insert(FixFileName(orgpattern));
       end;
 
 
     procedure dir_linklib(t:tdirectivetoken);
       begin
-        skipspace;
-        current_module^.linkSharedLibs.insert(readstring);
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}readstring;
+        current_module^.linkSharedLibs.insert(orgpattern);
       end;
 
 
     procedure dir_outputformat(t:tdirectivetoken);
-      var
-        hs : string;
       begin
         if not current_module^.in_main then
          Message(scan_w_switch_is_global)
         else
           begin
-            skipspace;
-            hs:=readid;
-            if set_string_asm(hs) then
+            {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+            if set_string_asm({$ifdef NEWINPUT}current_scanner^.{$endif}readid) then
              aktoutputformat:=target_asm.id
             else
              Message(scan_w_illegal_switch);
@@ -661,10 +688,10 @@ const
       var
         hs : string;
       begin
-        skipspace;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
         if upcase(c)='N' then
          begin
-           hs:=readid;
+           hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readid;
            if hs='NORMAL' then
             aktpackrecords:=2
            else
@@ -672,7 +699,7 @@ const
          end
         else
          begin
-           case readval of
+           case {$ifdef NEWINPUT}current_scanner^.{$endif}readval of
             1 : aktpackrecords:=1;
             2 : aktpackrecords:=2;
             4 : aktpackrecords:=4;
@@ -692,14 +719,13 @@ const
       var
         s : string;
       begin
-        skipspace;
-        s:=readid;
+        {$ifdef NEWINPUT}current_scanner^.{$endif}skipspace;
+        s:={$ifdef NEWINPUT}current_scanner^.{$endif}readid;
         if s='DEFAULT' then
          aktasmmode:=initasmmode
         else
          if not set_string_asmmode(s,aktasmmode) then
           Comment(V_Warning,'Unsupported asm mode specified '+s);
-
       end;
 
     procedure dir_oldasmmode(t:tdirectivetoken);
@@ -726,7 +752,6 @@ const
         end;
       { c contains the next char, a + or - would be fine }
         HandleSwitch(sw,c);
-        ReadComment;
       end;
 
 
@@ -775,12 +800,13 @@ const
 
     procedure handledirectives;
       var
-        t     : tdirectivetoken;
-        p     : tdirectiveproc;
-        hs    : string;
+        t  : tdirectivetoken;
+        p  : tdirectiveproc;
+        hs : string;
       begin
-         readchar; {Remove the $}
-         hs:=readid;
+         {$ifdef NEWINPUT}current_scanner^.{$endif}gettokenpos;
+         {$ifdef NEWINPUT}current_scanner^.{$endif}readchar; {Remove the $}
+         hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readid;
          Message1(scan_d_handling_switch,'$'+hs);
          if hs='' then
           Message1(scan_w_illegal_switch,'$'+hs);
@@ -788,11 +814,11 @@ const
          while (length(hs)=1) and (c in ['-','+']) do
           begin
             HandleSwitch(hs[1],c);
-            readchar; {Remove + or -}
+            {$ifdef NEWINPUT}current_scanner^.{$endif}readchar; {Remove + or -}
             if c=',' then
              begin
-               readchar;   {Remove , }
-               hs:=readid; {Check for multiple switches on one line}
+               {$ifdef NEWINPUT}current_scanner^.{$endif}readchar;   {Remove , }
+               hs:={$ifdef NEWINPUT}current_scanner^.{$endif}readid; {Check for multiple switches on one line}
                Message1(scan_d_handling_switch,'$'+hs);
              end
             else
@@ -815,14 +841,17 @@ const
             else
              Message1(scan_w_illegal_directive,'$'+hs);
           { conditionals already read the comment }
-            if (comment_level>0) then
-             readcomment;
+            if ({$ifdef NEWINPUT}current_scanner^.{$endif}comment_level>0) then
+             {$ifdef NEWINPUT}current_scanner^.{$endif}readcomment;
           end;
       end;
 
 {
   $Log$
-  Revision 1.11  1998-06-04 23:51:59  peter
+  Revision 1.12  1998-07-07 11:20:10  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.11  1998/06/04 23:51:59  peter
     * m68k compiles
     + .def file creation moved to gendef.pas so it could also be used
       for win32

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 628 - 130
compiler/scanner.pas


+ 8 - 3
compiler/symdef.inc

@@ -85,7 +85,8 @@
          if not(assigned(previousglobal)) then
            begin
               firstglobaldef := nextglobal;
-              firstglobaldef^.previousglobal:=nil;
+              if assigned(firstglobaldef) then
+                firstglobaldef^.previousglobal:=nil;
            end
          else
            begin
@@ -284,7 +285,8 @@
 
       var
          str : string;
-         
+
+
       begin
          { name }
          if assigned(sym) then
@@ -2644,7 +2646,10 @@
 
 {
   $Log$
-  Revision 1.15  1998-06-24 14:48:37  peter
+  Revision 1.16  1998-07-07 11:20:13  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.15  1998/06/24 14:48:37  peter
     * ifdef newppu -> ifndef oldppu
 
   Revision 1.14  1998/06/16 08:56:31  peter

+ 29 - 1
compiler/symppu.inc

@@ -132,6 +132,30 @@
       end;
 
 
+{$ifdef NEWINPUT}
+
+    procedure writesourcefiles;
+      var
+        hp    : pinputfile;
+        index : longint;
+      begin
+      { second write the used source files }
+        hp:=current_module^.sourcefiles.files;
+        index:=current_module^.sourcefiles.last_ref_index;
+        while assigned(hp) do
+         begin
+         { only name and extension }
+           current_ppu^.putstring(hp^.name^);
+         { index in that order }
+           hp^.ref_index:=index;
+           dec(index);
+           hp:=hp^.ref_next;
+         end;
+        current_ppu^.writeentry(ibsourcefiles);
+      end;
+
+{$else}
+
     procedure writesourcefiles;
       var
         hp2   : pextfile;
@@ -152,6 +176,7 @@
         current_ppu^.writeentry(ibsourcefiles);
       end;
 
+{$endif NEWINPUT}
 
     procedure writeusedunit;
       var
@@ -697,7 +722,10 @@
 
 {
   $Log$
-  Revision 1.5  1998-06-24 14:48:39  peter
+  Revision 1.6  1998-07-07 11:20:14  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.5  1998/06/24 14:48:39  peter
     * ifdef newppu -> ifndef oldppu
 
   Revision 1.4  1998/06/16 08:56:32  peter

+ 14 - 2
compiler/symsym.inc

@@ -34,10 +34,14 @@
 {$ifdef GDB}
          isstabwritten := false;
 {$endif GDB}
+{$ifdef NEWINPUT}
+         line_no:=aktfilepos.line;
+{$else}
          if assigned(current_module) and assigned(current_module^.current_inputfile) then
            line_no:=current_module^.current_inputfile^.line_no
          else
            line_no:=0;
+{$endif NEWINPUT}
 {$ifdef UseBrowser}
          defref:=nil;
          lastwritten:=nil;
@@ -539,7 +543,12 @@
       end;
      stabstring :=strpnew('"'+obj+':'+RetType
            +definition^.retdef^.numberstring+info+'",'+tostr(n_function)
-           +',0,'+tostr(current_module^.current_inputfile^.line_no)
+           +',0,'+
+{$ifdef NEWINPUT}
+           tostr(aktfilepos.line)
+{$else}
+           tostr(current_module^.current_inputfile^.line_no)
+{$endif}
            +','+definition^.mangledname);
     end;
 
@@ -1647,7 +1656,10 @@
 
 {
   $Log$
-  Revision 1.17  1998-06-24 14:48:40  peter
+  Revision 1.18  1998-07-07 11:20:15  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.17  1998/06/24 14:48:40  peter
     * ifdef newppu -> ifndef oldppu
 
   Revision 1.16  1998/06/19 15:40:42  peter

+ 8 - 1
compiler/tree.pas

@@ -283,7 +283,9 @@ unit tree;
     procedure set_location(var destloc,sourceloc : tlocation);
     procedure swap_location(var destloc,sourceloc : tlocation);
     procedure set_file_line(from,_to : ptree);
+{$ifndef NEWINPUT}
     procedure set_current_file_line(_to : ptree);
+{$endif}
     procedure set_tree_filepos(p : ptree;const filepos : tfileposinfo);
 {$ifdef extdebug}
     procedure compare_trees(oldp,p : ptree);
@@ -574,6 +576,7 @@ unit tree;
            _to^.fileinfo:=from^.fileinfo;
       end;
 
+{$ifndef NEWINPUT}
     procedure set_current_file_line(_to : ptree);
 
       begin
@@ -582,6 +585,7 @@ unit tree;
          current_module^.current_inputfile^.line_no:=_to^.fileinfo.line;
          current_module^.current_index:=_to^.fileinfo.fileindex;
       end;
+{$endif}
 
    procedure set_tree_filepos(p : ptree;const filepos : tfileposinfo);
      begin
@@ -1605,7 +1609,10 @@ unit tree;
 end.
 {
   $Log$
-  Revision 1.17  1998-06-22 08:59:03  daniel
+  Revision 1.18  1998-07-07 11:20:18  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.17  1998/06/22 08:59:03  daniel
   - Removed pool of nodes.
 
   Revision 1.16  1998/06/12 14:50:49  peter

+ 20 - 4
compiler/verb_def.pas

@@ -22,7 +22,6 @@
 }
 unit verb_def;
 interface
-uses verbose;
 
 procedure SetRedirectFile(const fn:string);
 
@@ -32,7 +31,11 @@ function  _internalerror(i : longint) : boolean;
 
 implementation
 uses
-  strings,dos,globals,files;
+  verbose,globals,
+{$ifndef NEWINPUT}
+   files,
+{$endif}
+  strings,dos;
 
 const
   { RHIDE expect gcc like error output }
@@ -100,7 +103,7 @@ begin
       begin
         if (status.compiledlines=1) then
           WriteLn(memavail shr 10,' Kb Free');
-        if (status.currentline mod 100=0) then
+        if (status.currentline>0) and (status.currentline mod 100=0) then
 {$ifdef FPC}
           WriteLn(status.currentline,' ',memavail shr 10,'/',system.heapsize shr 10,' Kb Free');
 {$else}
@@ -137,8 +140,18 @@ begin
             if (verbosity and Level)=V_Fatal then
               hs:=rh_errorstr;
           end;
+{$ifdef NEWINPUT}
+        if (Level<$100) and (status.currentline>0) then
+         begin
+           if Use_Rhide then
+             hs:=lower(bstoslash(status.currentsource))+':'+tostr(status.currentline)+': '+hs
+           else
+             hs:=status.currentsource+'('+tostr(status.currentline)+','+tostr(status.currentcolumn)+') '+hs;
+         end;
+{$else}
         if (Level<$100) and Assigned(current_module) and Assigned(current_module^.current_inputfile) then
           hs:=current_module^.current_inputfile^.get_file_line+' '+hs;
+{$endif NEWINPUT}
       { add the message to the text }
         hs:=hs+s;
 {$ifdef FPC}
@@ -180,7 +193,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.11  1998-06-19 15:40:00  peter
+  Revision 1.12  1998-07-07 11:20:19  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.11  1998/06/19 15:40:00  peter
     * bp7 fix
 
   Revision 1.10  1998/06/16 11:32:19  peter

+ 21 - 5
compiler/verbose.pas

@@ -56,10 +56,11 @@ Const
 
 type
   TCompileStatus = record
+    currentmodule,
     currentsource : string;   { filename }
-    currentline   : longint;  { current line number }
+    currentline,
+    currentcolumn : longint;  { current line and column }
     compiledlines : longint;  { the number of lines which are compiled }
-    totallines    : longint;  { total lines to compile, can be 0 }
     errorcount    : longint;  { number of generated errors }
   end;
 
@@ -94,8 +95,8 @@ var
 
 
 implementation
-uses globals;
-
+uses
+  globals;
 
 procedure LoadMsgFile(const fn:string);
 begin
@@ -226,6 +227,12 @@ begin
   dostop:=((l and V_Fatal)<>0);
   if (l and V_Error)<>0 then
    inc(status.errorcount);
+{ fix status }
+{$ifdef NEWINPUT}
+  status.currentline:=aktfilepos.line;
+  status.currentcolumn:=aktfilepos.column;
+{$endif}
+{ show comment }
   if do_comment(l,s) or dostop or (status.errorcount>=maxerrorcount) then
    stop
 end;
@@ -277,6 +284,12 @@ begin
   Delete(s,1,idx);
   Replace(s,'$VER',version_string);
   Replace(s,'$TARGET',target_string);
+{ fix status }
+{$ifdef NEWINPUT}
+  status.currentline:=aktfilepos.line;
+  status.currentcolumn:=aktfilepos.column;
+{$endif}
+{ show comment }
   if do_comment(v,s) or dostop or (status.errorcount>=maxerrorcount) then
    stop;
 end;
@@ -314,7 +327,10 @@ end.
 
 {
   $Log$
-  Revision 1.8  1998-05-23 01:21:35  peter
+  Revision 1.9  1998-07-07 11:20:20  peter
+    + NEWINPUT for a better inputfile and scanner object
+
+  Revision 1.8  1998/05/23 01:21:35  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

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است