Bläddra i källkod

* Could not compile with TP, some arrays moved to heap
* NOAG386BIN default for TP
* AG386* files were not compatible with TP, fixed.

daniel 26 år sedan
förälder
incheckning
1777e0c901

+ 12 - 3
compiler/Makefile

@@ -275,12 +275,12 @@ msg: msgtxt.inc
 
 
 # Make only the compiler
 # Make only the compiler
 ifndef COMPLETE
 ifndef COMPLETE
-$(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg
+$(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg tokens.dat
 	$(COMPILER) pp.pas
 	$(COMPILER) pp.pas
 	$(EXECPPAS)
 	$(EXECPPAS)
 	$(MOVE) $(PPEXENAME) $(EXENAME)
 	$(MOVE) $(PPEXENAME) $(EXENAME)
 else
 else
-$(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg
+$(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg tokens.dat
 	$(COMPILER) $(LOCALOPT) pp.pas
 	$(COMPILER) $(LOCALOPT) pp.pas
 	$(EXECPPAS)
 	$(EXECPPAS)
 	$(COMPILER) $(LOCALOPT) pp.pas
 	$(COMPILER) $(LOCALOPT) pp.pas
@@ -290,6 +290,10 @@ $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg
 	$(MOVE) $(PPEXENAME) $(EXENAME)
 	$(MOVE) $(PPEXENAME) $(EXENAME)
 endif
 endif
 
 
+tokens.dat : $(wildcard *.pas) $(wildcard *.inc)
+	$(COMPILER) $(LOCALOPT) tokendat.pas
+	./tokendat
+
 # This target remakes the units with the currently made version
 # This target remakes the units with the currently made version
 remake: $(EXENAME)
 remake: $(EXENAME)
 	$(MOVE) $(EXENAME) $(TEMPNAME)
 	$(MOVE) $(EXENAME) $(TEMPNAME)
@@ -399,7 +403,12 @@ $(M68KEXENAME): $(PASFILES) $(INCFILES)
 
 
 #
 #
 # $Log$
 # $Log$
-# Revision 1.35  1999-08-15 22:16:51  michael
+# Revision 1.36  1999-09-02 18:47:41  daniel
+#   * Could not compile with TP, some arrays moved to heap
+#   * NOAG386BIN default for TP
+#   * AG386* files were not compatible with TP, fixed.
+#
+# Revision 1.35  1999/08/15 22:16:51  michael
 # + No Intel and binary writer for linux=smaller executable
 # + No Intel and binary writer for linux=smaller executable
 #
 #
 # Revision 1.34  1999/06/15 15:10:06  peter
 # Revision 1.34  1999/06/15 15:10:06  peter

+ 8 - 3
compiler/ag386int.pas

@@ -574,9 +574,9 @@ ait_stab_function_name : ;
     var
     var
       currentasmlist : PAsmList;
       currentasmlist : PAsmList;
 
 
-    procedure writeexternal(p:pasmsymbol);{$ifndef FPC}far;{$endif}
+    procedure writeexternal(p:pnamedindexobject);{$ifndef FPC}far;{$endif}
       begin
       begin
-        if p^.typ=AS_EXTERNAL then
+        if pasmsymbol(p)^.typ=AS_EXTERNAL then
          currentasmlist^.AsmWriteln(#9'EXTRN'#9+p^.name);
          currentasmlist^.AsmWriteln(#9'EXTRN'#9+p^.name);
       end;
       end;
 
 
@@ -627,7 +627,12 @@ ait_stab_function_name : ;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.52  1999-08-25 11:59:36  jonas
+  Revision 1.53  1999-09-02 18:47:42  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.52  1999/08/25 11:59:36  jonas
     * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
     * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
 
 
   Revision 1.51  1999/08/04 00:22:36  florian
   Revision 1.51  1999/08/04 00:22:36  florian

+ 8 - 3
compiler/ag386nsm.pas

@@ -550,9 +550,9 @@ ait_stab_function_name : ;
     var
     var
       currentasmlist : PAsmList;
       currentasmlist : PAsmList;
 
 
-    procedure writeexternal(p:pasmsymbol);{$ifndef FPC}far;{$endif}
+    procedure writeexternal(p:pnamedindexobject);{$ifndef FPC}far;{$endif}
       begin
       begin
-        if p^.typ=AS_EXTERNAL then
+        if pasmsymbol(p)^.typ=AS_EXTERNAL then
          currentasmlist^.AsmWriteln('EXTERN'#9+p^.name);
          currentasmlist^.AsmWriteln('EXTERN'#9+p^.name);
       end;
       end;
 
 
@@ -602,7 +602,12 @@ ait_stab_function_name : ;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.49  1999-08-25 11:59:38  jonas
+  Revision 1.50  1999-09-02 18:47:43  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.49  1999/08/25 11:59:38  jonas
     * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
     * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
 
 
   Revision 1.48  1999/08/04 00:22:37  florian
   Revision 1.48  1999/08/04 00:22:37  florian

+ 7 - 2
compiler/assemble.pas

@@ -144,7 +144,7 @@ end;
 const
 const
   lastas  : byte=255;
   lastas  : byte=255;
 var
 var
-  LastASBin : string;
+  LastASBin : pathstr;
 Function TAsmList.FindAssembler:string;
 Function TAsmList.FindAssembler:string;
 var
 var
   asfound : boolean;
   asfound : boolean;
@@ -557,7 +557,12 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.52  1999-07-18 10:19:42  florian
+  Revision 1.53  1999-09-02 18:47:44  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.52  1999/07/18 10:19:42  florian
     * made it compilable with Dlephi 4 again
     * made it compilable with Dlephi 4 again
     + fixed problem with large stack allocations on win32
     + fixed problem with large stack allocations on win32
 
 

+ 9 - 2
compiler/compiler.pas

@@ -121,7 +121,7 @@ uses
   dos,
   dos,
 {$endif Delphi}
 {$endif Delphi}
   verbose,comphook,systems,
   verbose,comphook,systems,
-  globals,options,parser,symtable,link,import,export;
+  globals,options,parser,symtable,link,import,export,tokens;
 
 
 function Compile(const cmd:string):longint;
 function Compile(const cmd:string):longint;
 
 
@@ -177,6 +177,7 @@ begin
   CompilerInited:=false;
   CompilerInited:=false;
   DoneSymtable;
   DoneSymtable;
   DoneGlobals;
   DoneGlobals;
+  donetokens;
 {$ifdef USEEXCEPT}
 {$ifdef USEEXCEPT}
   recoverpospointer:=nil;
   recoverpospointer:=nil;
   longjump_used:=false;
   longjump_used:=false;
@@ -198,6 +199,7 @@ begin
   InitBrowserCol;
   InitBrowserCol;
 {$endif BrowserCol}
 {$endif BrowserCol}
   InitGlobals;
   InitGlobals;
+  inittokens;
   InitSymtable;
   InitSymtable;
   CompilerInited:=true;
   CompilerInited:=true;
 { read the arguments }
 { read the arguments }
@@ -297,7 +299,12 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.31  1999-08-20 10:17:01  michael
+  Revision 1.32  1999-09-02 18:47:44  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.31  1999/08/20 10:17:01  michael
   + Patch from pierre
   + Patch from pierre
 
 
   Revision 1.30  1999/08/11 17:26:31  peter
   Revision 1.30  1999/08/11 17:26:31  peter

+ 9 - 4
compiler/pbase.pas

@@ -90,7 +90,7 @@ unit pbase;
 
 
     function tokenstring(i : ttoken):string;
     function tokenstring(i : ttoken):string;
       begin
       begin
-        tokenstring:=tokeninfo[i].str;
+        tokenstring:=tokeninfo^[i].str;
       end;
       end;
 
 
     { consumes token i, write error if token is different }
     { consumes token i, write error if token is different }
@@ -98,9 +98,9 @@ unit pbase;
       begin
       begin
         if (token<>i) and (idtoken<>i) then
         if (token<>i) and (idtoken<>i) then
           if token=_id then
           if token=_id then
-            Message2(scan_f_syn_expected,tokeninfo[i].str,'identifier '+pattern)
+            Message2(scan_f_syn_expected,tokeninfo^[i].str,'identifier '+pattern)
           else
           else
-            Message2(scan_f_syn_expected,tokeninfo[i].str,tokeninfo[token].str)
+            Message2(scan_f_syn_expected,tokeninfo^[i].str,tokeninfo^[token].str)
         else
         else
           begin
           begin
             if token=_END then
             if token=_END then
@@ -165,7 +165,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.24  1999-08-04 13:02:50  jonas
+  Revision 1.25  1999-09-02 18:47:44  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.24  1999/08/04 13:02:50  jonas
     * all tokens now start with an underscore
     * all tokens now start with an underscore
     * PowerPC compiles!!
     * PowerPC compiles!!
 
 

+ 8 - 2
compiler/pp.pas

@@ -38,7 +38,7 @@
                       use external messagefiles, default for TP
                       use external messagefiles, default for TP
   NOAG386INT          no Intel Assembler output
   NOAG386INT          no Intel Assembler output
   NOAG386NSM          no NASM output
   NOAG386NSM          no NASM output
-  NOAG386BIN          leaves out the binary writer
+  NOAG386BIN          leaves out the binary writer, default for TP
   LOGMEMBLOCKS        adds memory manager which logs the size of
   LOGMEMBLOCKS        adds memory manager which logs the size of
                       each allocated memory block, the information
                       each allocated memory block, the information
                       is written to memuse.log after compiling
                       is written to memuse.log after compiling
@@ -95,6 +95,7 @@ program pp;
   {$IFDEF DPMI}
   {$IFDEF DPMI}
     {$UNDEF USEOVERLAY}
     {$UNDEF USEOVERLAY}
   {$ENDIF}
   {$ENDIF}
+  {$DEFINE NOAG386BIN}
 {$ENDIF}
 {$ENDIF}
 {$ifdef FPC}
 {$ifdef FPC}
   {$UNDEF USEOVERLAY}
   {$UNDEF USEOVERLAY}
@@ -279,7 +280,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.46  1999-08-28 15:34:20  florian
+  Revision 1.47  1999-09-02 18:47:45  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.46  1999/08/28 15:34:20  florian
     * bug 519 fixed
     * bug 519 fixed
 
 
   Revision 1.45  1999/08/04 00:23:18  florian
   Revision 1.45  1999/08/04 00:23:18  florian

+ 10 - 5
compiler/psub.pas

@@ -2013,17 +2013,17 @@ begin
        names^.insert(aktprocsym^.definition^.mangledname);
        names^.insert(aktprocsym^.definition^.mangledname);
       { set _FAIL as keyword if constructor }
       { set _FAIL as keyword if constructor }
       if (aktprocsym^.definition^.proctypeoption=potype_constructor) then
       if (aktprocsym^.definition^.proctypeoption=potype_constructor) then
-        tokeninfo[_FAIL].keyword:=m_all;
+        tokeninfo^[_FAIL].keyword:=m_all;
       if assigned(aktprocsym^.definition^._class) then
       if assigned(aktprocsym^.definition^._class) then
-        tokeninfo[_SELF].keyword:=m_all;
+        tokeninfo^[_SELF].keyword:=m_all;
 
 
        compile_proc_body(names^,((pdflags and pd_global)<>0),assigned(oldprocinfo._class));
        compile_proc_body(names^,((pdflags and pd_global)<>0),assigned(oldprocinfo._class));
 
 
       { reset _FAIL as normal }
       { reset _FAIL as normal }
       if (aktprocsym^.definition^.proctypeoption=potype_constructor) then
       if (aktprocsym^.definition^.proctypeoption=potype_constructor) then
-        tokeninfo[_FAIL].keyword:=m_none;
+        tokeninfo^[_FAIL].keyword:=m_none;
       if assigned(aktprocsym^.definition^._class) and (lexlevel=main_program_level) then
       if assigned(aktprocsym^.definition^._class) and (lexlevel=main_program_level) then
-        tokeninfo[_SELF].keyword:=m_none;
+        tokeninfo^[_SELF].keyword:=m_none;
        consume(_SEMICOLON);
        consume(_SEMICOLON);
      end;
      end;
 { close }
 { close }
@@ -2052,7 +2052,12 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.17  1999-08-30 10:17:57  peter
+  Revision 1.18  1999-09-02 18:47:45  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.17  1999/08/30 10:17:57  peter
     * fixed crash in psub
     * fixed crash in psub
     * ansistringcompare fixed
     * ansistringcompare fixed
     * support for #$0b8
     * support for #$0b8

+ 75 - 28
compiler/scandir.inc

@@ -21,7 +21,7 @@
  ****************************************************************************
  ****************************************************************************
 }
 }
 const
 const
-   directivelen=16;
+   directivelen=15;
 type
 type
    directivestr=string[directivelen];
    directivestr=string[directivelen];
    tdirectivetoken=(
    tdirectivetoken=(
@@ -54,30 +54,81 @@ const
    firstdirective=_DIR_NONE;
    firstdirective=_DIR_NONE;
    lastdirective=_DIR_Z4;
    lastdirective=_DIR_Z4;
    directive:array[tdirectivetoken] of directivestr=(
    directive:array[tdirectivetoken] of directivestr=(
+     {12345678901234567890 (To determine longest string.)}
      '',
      '',
-     'ALIGN','APPTYPE','ASMMODE','ASSERTIONS',
+     'ALIGN',
+     'APPTYPE',
+     'ASMMODE',
+     'ASSERTIONS',
      'BOOLEVAL',
      'BOOLEVAL',
-     'D','DEBUGINFO','DEFINE','DESCRIPTION',
-     'ELSE','ENDIF','ERROR','EXTENDEDSYNTAX',
+     'D',
+     'DEBUGINFO',
+     'DEFINE',
+     'DESCRIPTION',
+     'ELSE',
+     'ENDIF',
+     'ERROR',
+     'EXTENDEDSYNTAX',
      'FATAL',
      'FATAL',
      'GOTO',
      'GOTO',
-     'HINT','HINTS',
-     'I','I386_ATT','I386_DIRECT','I386_INTEL','IOCHECKS',
-       'IF','IFDEF','IFNDEF','IFOPT','INCLUDE','INCLUDEPATH',
-       'INFO','INLINE',
-     'L','LIBRARYPATH','LINK','LINKLIB','LOCALSYMBOLS',
-       'LONGSTRINGS',
-     'M','MACRO','MEMORY','MESSAGE','MINENUMSIZE','MMX','MODE',
-     'NOTE','NOTES',
-     'OBJECTPATH','OPENSTRINGS','OUTPUT_FORMAT','OVERFLOWCHECKS',
-     'PACKENUM','PACKRECORDS',
-     'R','RANGECHECKS','REFERENCEINFO',
-     'SATURATION','SMARTLINK','STACKFRAMES','STATIC','STOP',
-     'TYPEDADDRESS','TYPEINFO',
-     'UNDEF','UNITPATH',
+     'HINT',
+     'HINTS',
+     'I',
+     {12345678901234567890 (To determine longest string.)}
+     'I386_ATT',
+     'I386_DIRECT',
+     'I386_INTEL',
+     'IOCHECKS',
+     'IF',
+     'IFDEF',
+     'IFNDEF',
+     'IFOPT',
+     'INCLUDE',
+     'INCLUDEPATH',
+     'INFO',
+     'INLINE',
+     'L',
+     'LIBRARYPATH',
+     'LINK',
+     'LINKLIB',
+     'LOCALSYMBOLS',
+     'LONGSTRINGS',
+     'M',
+     {12345678901234567890 (To determine longest string.)}
+     'MACRO',
+     'MEMORY',
+     'MESSAGE',
+     'MINENUMSIZE',
+     'MMX',
+     'MODE',
+     'NOTE',
+     'NOTES',
+     'OBJECTPATH',
+     'OPENSTRINGS',
+     'OUTPUT_FORMAT',
+     'OVERFLOWCHECKS',
+     'PACKENUM',
+     'PACKRECORDS',
+     'R',
+     'RANGECHECKS',
+     'REFERENCEINFO',
+     'SATURATION',
+     'SMARTLINK',
+     {12345678901234567890 (To determine longest string.)}
+     'STACKFRAMES',
+     'STATIC',
+     'STOP',
+     'TYPEDADDRESS',
+     'TYPEINFO',
+     'UNDEF',
+     'UNITPATH',
      'VARSTRINGCHECKS',
      'VARSTRINGCHECKS',
-     'WAIT','WARNING','WARNINGS',
-     'Z1','Z2','Z4'
+     'WAIT',
+     'WARNING',
+     'WARNINGS',
+     'Z1',
+     'Z2',
+     'Z4'
      );
      );
 
 
 
 
@@ -307,8 +358,6 @@ const
                   current_scanner^.skipspace;
                   current_scanner^.skipspace;
                   hs:=current_scanner^.readid;
                   hs:=current_scanner^.readid;
                   mac:=pmacrosym(macros^.search(hs));
                   mac:=pmacrosym(macros^.search(hs));
-                  if assigned(mac) then
-                    mac^.is_used:=true;
                   current_scanner^.addpreprocstack(pp_ifdef,assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
                   current_scanner^.addpreprocstack(pp_ifdef,assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
                 end;
                 end;
    _DIR_IFOPT : begin
    _DIR_IFOPT : begin
@@ -335,8 +384,6 @@ const
                   current_scanner^.skipspace;
                   current_scanner^.skipspace;
                   hs:=current_scanner^.readid;
                   hs:=current_scanner^.readid;
                   mac:=pmacrosym(macros^.search(hs));
                   mac:=pmacrosym(macros^.search(hs));
-                  if assigned(mac) then
-                    mac^.is_used:=true;
                   current_scanner^.addpreprocstack(pp_ifndef,not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
                   current_scanner^.addpreprocstack(pp_ifndef,not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
                 end;
                 end;
            end;
            end;
@@ -387,7 +434,6 @@ const
                mac^.buftext:=nil;
                mac^.buftext:=nil;
              end;
              end;
           end;
           end;
-        mac^.is_used:=true;
         if (cs_support_macro in aktmoduleswitches) then
         if (cs_support_macro in aktmoduleswitches) then
           begin
           begin
           { key words are never substituted }
           { key words are never substituted }
@@ -455,7 +501,6 @@ const
                   mac^.buftext:=nil;
                   mac^.buftext:=nil;
                end;
                end;
           end;
           end;
-        mac^.is_used:=true;
       end;
       end;
 
 
 
 
@@ -1095,8 +1140,10 @@ const
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.60  1999-08-31 15:55:45  pierre
-   + tmacrosym.is_used set
+  Revision 1.61  1999-09-02 18:47:46  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
 
 
   Revision 1.59  1999/08/05 16:53:10  peter
   Revision 1.59  1999/08/05 16:53:10  peter
     * V_Fatal=1, all other V_ are also increased
     * V_Fatal=1, all other V_ are also increased

+ 17 - 40
compiler/scanner.pas

@@ -141,39 +141,13 @@ implementation
                               Helper routines
                               Helper routines
 *****************************************************************************}
 *****************************************************************************}
 
 
-    type
-      tokenidxrec=record
-        first,last : ttoken;
-      end;
-    var
-      tokenidx:array[2..tokenidlen,'A'..'Z'] of tokenidxrec;
-
     const
     const
       { use any special name that is an invalid file name to avoid problems }
       { use any special name that is an invalid file name to avoid problems }
       macro_special_name = '____Macro____';
       macro_special_name = '____Macro____';
-      preprocstring : array [preproctyp] of string[7]
+      preprocstring : array [preproctyp] of string[6]
         = ('$IFDEF','$IFNDEF','$IF','$IFOPT','$ELSE');
         = ('$IFDEF','$IFNDEF','$IF','$IFOPT','$ELSE');
 
 
 
 
-    procedure create_tokenidx;
-    { create an index with the first and last token for every possible token
-      length, so a search only will be done in that small part }
-      var
-        t : ttoken;
-      begin
-        fillchar(tokenidx,sizeof(tokenidx),0);
-        for t:=low(ttoken) to high(ttoken) do
-         begin
-           if not tokeninfo[t].special then
-            begin
-              if ord(tokenidx[length(tokeninfo[t].str),tokeninfo[t].str[1]].first)=0 then
-               tokenidx[length(tokeninfo[t].str),tokeninfo[t].str[1]].first:=t;
-              tokenidx[length(tokeninfo[t].str),tokeninfo[t].str[1]].last:=t;
-            end;
-         end;
-      end;
-
-
     function is_keyword(const s:string):boolean;
     function is_keyword(const s:string):boolean;
       var
       var
         low,high,mid : longint;
         low,high,mid : longint;
@@ -183,18 +157,18 @@ implementation
            is_keyword:=false;
            is_keyword:=false;
            exit;
            exit;
          end;
          end;
-        low:=ord(tokenidx[length(s),s[1]].first);
-        high:=ord(tokenidx[length(s),s[1]].last);
+        low:=ord(tokenidx^[length(s),s[1]].first);
+        high:=ord(tokenidx^[length(s),s[1]].last);
         while low<high do
         while low<high do
          begin
          begin
            mid:=(high+low+1) shr 1;
            mid:=(high+low+1) shr 1;
-           if pattern<tokeninfo[ttoken(mid)].str then
+           if pattern<tokeninfo^[ttoken(mid)].str then
             high:=mid-1
             high:=mid-1
            else
            else
             low:=mid;
             low:=mid;
          end;
          end;
-        is_keyword:=(pattern=tokeninfo[ttoken(high)].str) and
-                    (tokeninfo[ttoken(high)].keyword in aktmodeswitches);
+        is_keyword:=(pattern=tokeninfo^[ttoken(high)].str) and
+                    (tokeninfo^[ttoken(high)].keyword in aktmodeswitches);
       end;
       end;
 
 
 
 
@@ -1102,19 +1076,19 @@ implementation
            pattern is always uppercased }
            pattern is always uppercased }
            if (pattern[1]<>'_') and (length(pattern) in [2..tokenidlen]) then
            if (pattern[1]<>'_') and (length(pattern) in [2..tokenidlen]) then
             begin
             begin
-              low:=ord(tokenidx[length(pattern),pattern[1]].first);
-              high:=ord(tokenidx[length(pattern),pattern[1]].last);
+              low:=ord(tokenidx^[length(pattern),pattern[1]].first);
+              high:=ord(tokenidx^[length(pattern),pattern[1]].last);
               while low<high do
               while low<high do
                begin
                begin
                  mid:=(high+low+1) shr 1;
                  mid:=(high+low+1) shr 1;
-                 if pattern<tokeninfo[ttoken(mid)].str then
+                 if pattern<tokeninfo^[ttoken(mid)].str then
                   high:=mid-1
                   high:=mid-1
                  else
                  else
                   low:=mid;
                   low:=mid;
                end;
                end;
-              if pattern=tokeninfo[ttoken(high)].str then
+              if pattern=tokeninfo^[ttoken(high)].str then
                begin
                begin
-                 if tokeninfo[ttoken(high)].keyword in aktmodeswitches then
+                 if tokeninfo^[ttoken(high)].keyword in aktmodeswitches then
                   token:=ttoken(high);
                   token:=ttoken(high);
                  idtoken:=ttoken(high);
                  idtoken:=ttoken(high);
                end;
                end;
@@ -1692,12 +1666,15 @@ exit_label:
          end;
          end;
       end;
       end;
 
 
-begin
-  create_tokenidx;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.93  1999-08-30 10:17:58  peter
+  Revision 1.94  1999-09-02 18:47:47  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.93  1999/08/30 10:17:58  peter
     * fixed crash in psub
     * fixed crash in psub
     * ansistringcompare fixed
     * ansistringcompare fixed
     * support for #$0b8
     * support for #$0b8

+ 253 - 0
compiler/tokendat.pas

@@ -0,0 +1,253 @@
+{
+    $Id$
+    Copyright (c) 1999 by Daniel Mantione, Peter Vreman
+    Members of the Free Pascal development team
+
+    This little program generates a file of tokendata
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+program tokendat;
+
+uses    tokens,globtype;
+
+const
+  tokeninfo:array[ttoken] of tokenrec=(
+      (str:''              ;special:true ;keyword:m_none),
+    { Operators which can be overloaded }
+      (str:'+'             ;special:true ;keyword:m_none),
+      (str:'-'             ;special:true ;keyword:m_none),
+      (str:'*'             ;special:true ;keyword:m_none),
+      (str:'/'             ;special:true ;keyword:m_none),
+      (str:'='             ;special:true ;keyword:m_none),
+      (str:'>'             ;special:true ;keyword:m_none),
+      (str:'<'             ;special:true ;keyword:m_none),
+      (str:'>='            ;special:true ;keyword:m_none),
+      (str:'<='            ;special:true ;keyword:m_none),
+      (str:'><'            ;special:true ;keyword:m_none),
+      (str:'**'            ;special:true ;keyword:m_none),
+      (str:'is'            ;special:true ;keyword:m_none),
+      (str:'as'            ;special:true ;keyword:m_none),
+      (str:'in'            ;special:true ;keyword:m_none),
+      (str:':='            ;special:true ;keyword:m_none),
+    { Special chars }
+      (str:'^'             ;special:true ;keyword:m_none),
+      (str:'<>'            ;special:true ;keyword:m_none),
+      (str:'['             ;special:true ;keyword:m_none),
+      (str:']'             ;special:true ;keyword:m_none),
+      (str:'.'             ;special:true ;keyword:m_none),
+      (str:','             ;special:true ;keyword:m_none),
+      (str:'('             ;special:true ;keyword:m_none),
+      (str:')'             ;special:true ;keyword:m_none),
+      (str:':'             ;special:true ;keyword:m_none),
+      (str:';'             ;special:true ;keyword:m_none),
+      (str:'@'             ;special:true ;keyword:m_none),
+      (str:'..'            ;special:true ;keyword:m_none),
+      (str:'@@'            ;special:true ;keyword:m_none),
+      (str:'end of file'   ;special:true ;keyword:m_none),
+      (str:'identifier'    ;special:true ;keyword:m_none),
+      (str:'non identifier';special:true ;keyword:m_none),
+      (str:'const real'    ;special:true ;keyword:m_none),
+      (str:'ordinal const' ;special:true ;keyword:m_none),
+      (str:'const string'  ;special:true ;keyword:m_none),
+      (str:'const char'    ;special:true ;keyword:m_none),
+    { C like operators }
+      (str:'+='            ;special:true ;keyword:m_none),
+      (str:'-='            ;special:true ;keyword:m_none),
+      (str:'&='            ;special:true ;keyword:m_none),
+      (str:'|='            ;special:true ;keyword:m_none),
+      (str:'*='            ;special:true ;keyword:m_none),
+      (str:'/='            ;special:true ;keyword:m_none),
+      (str:''              ;special:true ;keyword:m_none),
+      (str:''              ;special:true ;keyword:m_none),
+      (str:''              ;special:true ;keyword:m_none),
+      (str:''              ;special:true ;keyword:m_none),
+    { Normal words }
+      (str:'AS'            ;special:false;keyword:m_class),
+      (str:'AT'            ;special:false;keyword:m_none),
+      (str:'DO'            ;special:false;keyword:m_all),
+      (str:'IF'            ;special:false;keyword:m_all),
+      (str:'IN'            ;special:false;keyword:m_all),
+      (str:'IS'            ;special:false;keyword:m_class),
+      (str:'OF'            ;special:false;keyword:m_all),
+      (str:'ON'            ;special:false;keyword:m_class),
+      (str:'OR'            ;special:false;keyword:m_all),
+      (str:'TO'            ;special:false;keyword:m_all),
+      (str:'AND'           ;special:false;keyword:m_all),
+      (str:'ASM'           ;special:false;keyword:m_all),
+      (str:'DIV'           ;special:false;keyword:m_all),
+      (str:'END'           ;special:false;keyword:m_all),
+      (str:'FAR'           ;special:false;keyword:m_none),
+      (str:'FOR'           ;special:false;keyword:m_all),
+      (str:'MOD'           ;special:false;keyword:m_all),
+      (str:'NEW'           ;special:false;keyword:m_all),
+      (str:'NIL'           ;special:false;keyword:m_all),
+      (str:'NOT'           ;special:false;keyword:m_all),
+      (str:'SET'           ;special:false;keyword:m_all),
+      (str:'SHL'           ;special:false;keyword:m_all),
+      (str:'SHR'           ;special:false;keyword:m_all),
+      (str:'TRY'           ;special:false;keyword:m_class),
+      (str:'VAR'           ;special:false;keyword:m_all),
+      (str:'XOR'           ;special:false;keyword:m_all),
+      (str:'CASE'          ;special:false;keyword:m_all),
+      (str:'CVAR'          ;special:false;keyword:m_none),
+      (str:'ELSE'          ;special:false;keyword:m_all),
+      (str:'EXIT'          ;special:false;keyword:m_all),
+      (str:'FAIL'          ;special:false;keyword:m_none), { only set within constructors PM }
+      (str:'FILE'          ;special:false;keyword:m_all),
+      (str:'GOTO'          ;special:false;keyword:m_all),
+      (str:'NAME'          ;special:false;keyword:m_none),
+      (str:'NEAR'          ;special:false;keyword:m_none),
+      (str:'READ'          ;special:false;keyword:m_none),
+      (str:'SELF'          ;special:false;keyword:m_none), {set inside methods only PM }
+      (str:'THEN'          ;special:false;keyword:m_all),
+      (str:'TRUE'          ;special:false;keyword:m_all),
+      (str:'TYPE'          ;special:false;keyword:m_all),
+      (str:'UNIT'          ;special:false;keyword:m_all),
+      (str:'USES'          ;special:false;keyword:m_all),
+      (str:'WITH'          ;special:false;keyword:m_all),
+      (str:'ALIAS'         ;special:false;keyword:m_none),
+      (str:'ARRAY'         ;special:false;keyword:m_all),
+      (str:'BEGIN'         ;special:false;keyword:m_all),
+      (str:'BREAK'         ;special:false;keyword:m_none),
+      (str:'CDECL'         ;special:false;keyword:m_none),
+      (str:'CLASS'         ;special:false;keyword:m_class),
+      (str:'CONST'         ;special:false;keyword:m_all),
+      (str:'FALSE'         ;special:false;keyword:m_all),
+      (str:'INDEX'         ;special:false;keyword:m_none),
+      (str:'LABEL'         ;special:false;keyword:m_all),
+      (str:'RAISE'         ;special:false;keyword:m_class),
+      (str:'UNTIL'         ;special:false;keyword:m_all),
+      (str:'WHILE'         ;special:false;keyword:m_all),
+      (str:'WRITE'         ;special:false;keyword:m_none),
+      (str:'DOWNTO'        ;special:false;keyword:m_all),
+      (str:'EXCEPT'        ;special:false;keyword:m_class),
+      (str:'EXPORT'        ;special:false;keyword:m_none),
+      (str:'INLINE'        ;special:false;keyword:m_none),
+      (str:'OBJECT'        ;special:false;keyword:m_all),
+      (str:'PACKED'        ;special:false;keyword:m_all),
+      (str:'PASCAL'        ;special:false;keyword:m_none),
+      (str:'PUBLIC'        ;special:false;keyword:m_none),
+      (str:'RECORD'        ;special:false;keyword:m_all),
+      (str:'REPEAT'        ;special:false;keyword:m_all),
+      (str:'RESULT'        ;special:false;keyword:m_none),
+      (str:'STATIC'        ;special:false;keyword:m_none),
+      (str:'STORED'        ;special:false;keyword:m_none),
+      (str:'STRING'        ;special:false;keyword:m_all),
+      (str:'SYSTEM'        ;special:false;keyword:m_none),
+      (str:'ASMNAME'       ;special:false;keyword:m_none),
+      (str:'DEFAULT'       ;special:false;keyword:m_none),
+      (str:'DISPOSE'       ;special:false;keyword:m_all),
+      (str:'DYNAMIC'       ;special:false;keyword:m_none),
+      (str:'EXPORTS'       ;special:false;keyword:m_all),
+      (str:'FINALLY'       ;special:false;keyword:m_class),
+      (str:'FORWARD'       ;special:false;keyword:m_none),
+      (str:'IOCHECK'       ;special:false;keyword:m_none),
+      (str:'LIBRARY'       ;special:false;keyword:m_all),
+      (str:'MESSAGE'       ;special:false;keyword:m_none),
+      (str:'PRIVATE'       ;special:false;keyword:m_none),
+      (str:'PROGRAM'       ;special:false;keyword:m_all),
+      (str:'STDCALL'       ;special:false;keyword:m_none),
+      (str:'SYSCALL'       ;special:false;keyword:m_none),
+      (str:'VIRTUAL'       ;special:false;keyword:m_none),
+      (str:'ABSOLUTE'      ;special:false;keyword:m_none),
+      (str:'ABSTRACT'      ;special:false;keyword:m_none),
+      (str:'CONTINUE'      ;special:false;keyword:m_none),
+      (str:'EXTERNAL'      ;special:false;keyword:m_none),
+      (str:'FUNCTION'      ;special:false;keyword:m_all),
+      (str:'OPERATOR'      ;special:false;keyword:m_fpc),
+      (str:'OVERRIDE'      ;special:false;keyword:m_none),
+      (str:'POPSTACK'      ;special:false;keyword:m_none),
+      (str:'PROPERTY'      ;special:false;keyword:m_class),
+      (str:'REGISTER'      ;special:false;keyword:m_none),
+      (str:'RESIDENT'      ;special:false;keyword:m_none),
+      (str:'SAFECALL'      ;special:false;keyword:m_none),
+      (str:'ASSEMBLER'     ;special:false;keyword:m_none),
+      (str:'INHERITED'     ;special:false;keyword:m_all),
+      (str:'INTERFACE'     ;special:false;keyword:m_all),
+      (str:'INTERRUPT'     ;special:false;keyword:m_none),
+      (str:'NODEFAULT'     ;special:false;keyword:m_none),
+      (str:'OTHERWISE'     ;special:false;keyword:m_all),
+      (str:'PROCEDURE'     ;special:false;keyword:m_all),
+      (str:'PROTECTED'     ;special:false;keyword:m_none),
+      (str:'PUBLISHED'     ;special:false;keyword:m_none),
+      (str:'THREADVAR'     ;special:false;keyword:m_class),
+      (str:'DESTRUCTOR'    ;special:false;keyword:m_all),
+      (str:'INTERNPROC'    ;special:false;keyword:m_none),
+      (str:'OPENSTRING'    ;special:false;keyword:m_none),
+      (str:'CONSTRUCTOR'   ;special:false;keyword:m_all),
+      (str:'INTERNCONST'   ;special:false;keyword:m_none),
+      (str:'SHORTSTRING'   ;special:false;keyword:m_none),
+      (str:'FINALIZATION'  ;special:false;keyword:m_initfinal),
+      (str:'SAVEREGISTERS' ;special:false;keyword:m_none),
+      (str:'IMPLEMENTATION';special:false;keyword:m_all),
+      (str:'INITIALIZATION';special:false;keyword:m_initfinal),
+      (str:'RESOURCESTRING';special:false;keyword:m_class)
+  );
+
+{Header is designed both to identify the file and to display a nice
+ message when you use the type command on it.
+
+Explanation:
+
+#8      String length is also displayed. A backspace erases it.
+#13#10  Needed to display dos prompt on next line.
+#26     End of file. Causes type to stop reading the file.
+}
+
+procedure create_tokenidx;
+
+{ create an index with the first and last token for every possible token
+ length, so a search only will be done in that small part }
+
+var t : ttoken;
+
+begin
+  fillchar(tokenidx^,sizeof(tokenidx^),0);
+  for t:=low(ttoken) to high(ttoken) do
+   begin
+     if not tokeninfo[t].special then
+      begin
+        if ord(tokenidx^[length(tokeninfo[t].str),tokeninfo[t].str[1]].first)=0 then
+         tokenidx^[length(tokeninfo[t].str),tokeninfo[t].str[1]].first:=t;
+        tokenidx^[length(tokeninfo[t].str),tokeninfo[t].str[1]].last:=t;
+      end;
+   end;
+end;
+
+const   headerstr:string[length(tokheader)]=tokheader;
+
+var f:file;
+    a:longint;
+
+begin
+    new(tokenidx);
+    create_tokenidx;
+    assign(f,'tokens.dat');
+    rewrite(f,1);
+    {Write header...}
+    blockwrite(f,headerstr,sizeof(headerstr));
+    {Write size of tokeninfo.}
+    a:=sizeof(tokeninfo);
+    blockwrite(f,a,sizeof(a));
+    {Write tokeninfo.}
+    blockwrite(f,tokeninfo,sizeof(tokeninfo));
+    {Write tokenindex.}
+    blockwrite(f,tokenidx^,sizeof(tokenidx^));
+    close(f);
+    dispose(tokenidx);
+end.

+ 64 - 174
compiler/tokens.pas

@@ -27,6 +27,7 @@ uses
 
 
 const
 const
   tokenidlen=14;
   tokenidlen=14;
+  tokheader=#8'Free Pascal Compiler -- Token data'#13#10#26;
 
 
 type
 type
   ttoken=(NOTOKEN,
   ttoken=(NOTOKEN,
@@ -208,186 +209,75 @@ type
     encoded : longint;
     encoded : longint;
   end;
   end;
 
 
-const
-  tokeninfo:array[ttoken] of tokenrec=(
-      (str:''              ;special:true ;keyword:m_none),
-    { Operators which can be overloaded }
-      (str:'+'             ;special:true ;keyword:m_none),
-      (str:'-'             ;special:true ;keyword:m_none),
-      (str:'*'             ;special:true ;keyword:m_none),
-      (str:'/'             ;special:true ;keyword:m_none),
-      (str:'='             ;special:true ;keyword:m_none),
-      (str:'>'             ;special:true ;keyword:m_none),
-      (str:'<'             ;special:true ;keyword:m_none),
-      (str:'>='            ;special:true ;keyword:m_none),
-      (str:'<='            ;special:true ;keyword:m_none),
-      (str:'><'            ;special:true ;keyword:m_none),
-      (str:'**'            ;special:true ;keyword:m_none),
-      (str:'is'            ;special:true ;keyword:m_none),
-      (str:'as'            ;special:true ;keyword:m_none),
-      (str:'in'            ;special:true ;keyword:m_none),
-      (str:':='            ;special:true ;keyword:m_none),
-    { Special chars }
-      (str:'^'             ;special:true ;keyword:m_none),
-      (str:'<>'            ;special:true ;keyword:m_none),
-      (str:'['             ;special:true ;keyword:m_none),
-      (str:']'             ;special:true ;keyword:m_none),
-      (str:'.'             ;special:true ;keyword:m_none),
-      (str:','             ;special:true ;keyword:m_none),
-      (str:'('             ;special:true ;keyword:m_none),
-      (str:')'             ;special:true ;keyword:m_none),
-      (str:':'             ;special:true ;keyword:m_none),
-      (str:';'             ;special:true ;keyword:m_none),
-      (str:'@'             ;special:true ;keyword:m_none),
-      (str:'..'            ;special:true ;keyword:m_none),
-      (str:'@@'            ;special:true ;keyword:m_none),
-      (str:'end of file'   ;special:true ;keyword:m_none),
-      (str:'identifier'    ;special:true ;keyword:m_none),
-      (str:'non identifier';special:true ;keyword:m_none),
-      (str:'const real'    ;special:true ;keyword:m_none),
-      (str:'ordinal const' ;special:true ;keyword:m_none),
-      (str:'const string'  ;special:true ;keyword:m_none),
-      (str:'const char'    ;special:true ;keyword:m_none),
-    { C like operators }
-      (str:'+='            ;special:true ;keyword:m_none),
-      (str:'-='            ;special:true ;keyword:m_none),
-      (str:'&='            ;special:true ;keyword:m_none),
-      (str:'|='            ;special:true ;keyword:m_none),
-      (str:'*='            ;special:true ;keyword:m_none),
-      (str:'/='            ;special:true ;keyword:m_none),
-      (str:''              ;special:true ;keyword:m_none),
-      (str:''              ;special:true ;keyword:m_none),
-      (str:''              ;special:true ;keyword:m_none),
-      (str:''              ;special:true ;keyword:m_none),
-    { Normal words }
-      (str:'AS'            ;special:false;keyword:m_class),
-      (str:'AT'            ;special:false;keyword:m_none),
-      (str:'DO'            ;special:false;keyword:m_all),
-      (str:'IF'            ;special:false;keyword:m_all),
-      (str:'IN'            ;special:false;keyword:m_all),
-      (str:'IS'            ;special:false;keyword:m_class),
-      (str:'OF'            ;special:false;keyword:m_all),
-      (str:'ON'            ;special:false;keyword:m_class),
-      (str:'OR'            ;special:false;keyword:m_all),
-      (str:'TO'            ;special:false;keyword:m_all),
-      (str:'AND'           ;special:false;keyword:m_all),
-      (str:'ASM'           ;special:false;keyword:m_all),
-      (str:'DIV'           ;special:false;keyword:m_all),
-      (str:'END'           ;special:false;keyword:m_all),
-      (str:'FAR'           ;special:false;keyword:m_none),
-      (str:'FOR'           ;special:false;keyword:m_all),
-      (str:'MOD'           ;special:false;keyword:m_all),
-      (str:'NEW'           ;special:false;keyword:m_all),
-      (str:'NIL'           ;special:false;keyword:m_all),
-      (str:'NOT'           ;special:false;keyword:m_all),
-      (str:'SET'           ;special:false;keyword:m_all),
-      (str:'SHL'           ;special:false;keyword:m_all),
-      (str:'SHR'           ;special:false;keyword:m_all),
-      (str:'TRY'           ;special:false;keyword:m_class),
-      (str:'VAR'           ;special:false;keyword:m_all),
-      (str:'XOR'           ;special:false;keyword:m_all),
-      (str:'CASE'          ;special:false;keyword:m_all),
-      (str:'CVAR'          ;special:false;keyword:m_none),
-      (str:'ELSE'          ;special:false;keyword:m_all),
-      (str:'EXIT'          ;special:false;keyword:m_all),
-      (str:'FAIL'          ;special:false;keyword:m_none), { only set within constructors PM }
-      (str:'FILE'          ;special:false;keyword:m_all),
-      (str:'GOTO'          ;special:false;keyword:m_all),
-      (str:'NAME'          ;special:false;keyword:m_none),
-      (str:'NEAR'          ;special:false;keyword:m_none),
-      (str:'READ'          ;special:false;keyword:m_none),
-      (str:'SELF'          ;special:false;keyword:m_none), {set inside methods only PM }
-      (str:'THEN'          ;special:false;keyword:m_all),
-      (str:'TRUE'          ;special:false;keyword:m_all),
-      (str:'TYPE'          ;special:false;keyword:m_all),
-      (str:'UNIT'          ;special:false;keyword:m_all),
-      (str:'USES'          ;special:false;keyword:m_all),
-      (str:'WITH'          ;special:false;keyword:m_all),
-      (str:'ALIAS'         ;special:false;keyword:m_none),
-      (str:'ARRAY'         ;special:false;keyword:m_all),
-      (str:'BEGIN'         ;special:false;keyword:m_all),
-      (str:'BREAK'         ;special:false;keyword:m_none),
-      (str:'CDECL'         ;special:false;keyword:m_none),
-      (str:'CLASS'         ;special:false;keyword:m_class),
-      (str:'CONST'         ;special:false;keyword:m_all),
-      (str:'FALSE'         ;special:false;keyword:m_all),
-      (str:'INDEX'         ;special:false;keyword:m_none),
-      (str:'LABEL'         ;special:false;keyword:m_all),
-      (str:'RAISE'         ;special:false;keyword:m_class),
-      (str:'UNTIL'         ;special:false;keyword:m_all),
-      (str:'WHILE'         ;special:false;keyword:m_all),
-      (str:'WRITE'         ;special:false;keyword:m_none),
-      (str:'DOWNTO'        ;special:false;keyword:m_all),
-      (str:'EXCEPT'        ;special:false;keyword:m_class),
-      (str:'EXPORT'        ;special:false;keyword:m_none),
-      (str:'INLINE'        ;special:false;keyword:m_none),
-      (str:'OBJECT'        ;special:false;keyword:m_all),
-      (str:'PACKED'        ;special:false;keyword:m_all),
-      (str:'PASCAL'        ;special:false;keyword:m_none),
-      (str:'PUBLIC'        ;special:false;keyword:m_none),
-      (str:'RECORD'        ;special:false;keyword:m_all),
-      (str:'REPEAT'        ;special:false;keyword:m_all),
-      (str:'RESULT'        ;special:false;keyword:m_none),
-      (str:'STATIC'        ;special:false;keyword:m_none),
-      (str:'STORED'        ;special:false;keyword:m_none),
-      (str:'STRING'        ;special:false;keyword:m_all),
-      (str:'SYSTEM'        ;special:false;keyword:m_none),
-      (str:'ASMNAME'       ;special:false;keyword:m_none),
-      (str:'DEFAULT'       ;special:false;keyword:m_none),
-      (str:'DISPOSE'       ;special:false;keyword:m_all),
-      (str:'DYNAMIC'       ;special:false;keyword:m_none),
-      (str:'EXPORTS'       ;special:false;keyword:m_all),
-      (str:'FINALLY'       ;special:false;keyword:m_class),
-      (str:'FORWARD'       ;special:false;keyword:m_none),
-      (str:'IOCHECK'       ;special:false;keyword:m_none),
-      (str:'LIBRARY'       ;special:false;keyword:m_all),
-      (str:'MESSAGE'       ;special:false;keyword:m_none),
-      (str:'PRIVATE'       ;special:false;keyword:m_none),
-      (str:'PROGRAM'       ;special:false;keyword:m_all),
-      (str:'STDCALL'       ;special:false;keyword:m_none),
-      (str:'SYSCALL'       ;special:false;keyword:m_none),
-      (str:'VIRTUAL'       ;special:false;keyword:m_none),
-      (str:'ABSOLUTE'      ;special:false;keyword:m_none),
-      (str:'ABSTRACT'      ;special:false;keyword:m_none),
-      (str:'CONTINUE'      ;special:false;keyword:m_none),
-      (str:'EXTERNAL'      ;special:false;keyword:m_none),
-      (str:'FUNCTION'      ;special:false;keyword:m_all),
-      (str:'OPERATOR'      ;special:false;keyword:m_fpc),
-      (str:'OVERRIDE'      ;special:false;keyword:m_none),
-      (str:'POPSTACK'      ;special:false;keyword:m_none),
-      (str:'PROPERTY'      ;special:false;keyword:m_class),
-      (str:'REGISTER'      ;special:false;keyword:m_none),
-      (str:'RESIDENT'      ;special:false;keyword:m_none),
-      (str:'SAFECALL'      ;special:false;keyword:m_none),
-      (str:'ASSEMBLER'     ;special:false;keyword:m_none),
-      (str:'INHERITED'     ;special:false;keyword:m_all),
-      (str:'INTERFACE'     ;special:false;keyword:m_all),
-      (str:'INTERRUPT'     ;special:false;keyword:m_none),
-      (str:'NODEFAULT'     ;special:false;keyword:m_none),
-      (str:'OTHERWISE'     ;special:false;keyword:m_all),
-      (str:'PROCEDURE'     ;special:false;keyword:m_all),
-      (str:'PROTECTED'     ;special:false;keyword:m_none),
-      (str:'PUBLISHED'     ;special:false;keyword:m_none),
-      (str:'THREADVAR'     ;special:false;keyword:m_class),
-      (str:'DESTRUCTOR'    ;special:false;keyword:m_all),
-      (str:'INTERNPROC'    ;special:false;keyword:m_none),
-      (str:'OPENSTRING'    ;special:false;keyword:m_none),
-      (str:'CONSTRUCTOR'   ;special:false;keyword:m_all),
-      (str:'INTERNCONST'   ;special:false;keyword:m_none),
-      (str:'SHORTSTRING'   ;special:false;keyword:m_none),
-      (str:'FINALIZATION'  ;special:false;keyword:m_initfinal),
-      (str:'SAVEREGISTERS' ;special:false;keyword:m_none),
-      (str:'IMPLEMENTATION';special:false;keyword:m_all),
-      (str:'INITIALIZATION';special:false;keyword:m_initfinal),
-      (str:'RESOURCESTRING';special:false;keyword:m_class)
-  );
+  ttokenarray=array[ttoken] of tokenrec;
+  ptokenarray=^ttokenarray;
+
+  tokenidxrec=record
+    first,last : ttoken;
+  end;
+
+  ptokenidx=^ttokenidx;
+  ttokenidx=array[2..tokenidlen,'A'..'Z'] of tokenidxrec;
+
+
+var tokeninfo:ptokenarray;
+    tokenidx:ptokenidx;
+
+procedure inittokens;
+procedure donetokens;
 
 
 implementation
 implementation
 
 
+uses    globals;
+
+procedure inittokens;
+
+var f:file;
+    header:string;
+    a:longint;
+
+begin
+    assign(f,exepath+'tokens.dat');
+    reset(f,1);
+    {We are not sure that the msg file is loaded!}
+    if ioresult<>0 then
+        begin
+            close(f);
+            writeln('Fatal: File tokens.dat not found.');
+            halt(3);
+        end;
+    blockread(f,header,1);
+    blockread(f,header[1],length(header));
+    blockread(f,a,sizeof(a));
+    if (header<>tokheader) or (a<>sizeof(ttokenarray)) then
+        begin
+            close(f);
+            writeln('Fatal: File tokens.dat corrupt.');
+            halt(3);
+        end;
+    new(tokeninfo);
+    blockread(f,tokeninfo^,sizeof(ttokenarray));
+    new(tokenidx);
+    blockread(f,tokenidx^,sizeof(tokenidx^));
+    close(f);
+end;
+
+procedure donetokens;
+
+begin
+    dispose(tokeninfo);
+    dispose(tokenidx);
+end;
+
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.11  1999-08-04 13:03:17  jonas
+  Revision 1.12  1999-09-02 18:47:49  daniel
+    * Could not compile with TP, some arrays moved to heap
+    * NOAG386BIN default for TP
+    * AG386* files were not compatible with TP, fixed.
+
+  Revision 1.11  1999/08/04 13:03:17  jonas
     * all tokens now start with an underscore
     * all tokens now start with an underscore
     * PowerPC compiles!!
     * PowerPC compiles!!