mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:19:31 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
    $Id$
 | 
						|
    Copyright (c) 1998-2000 by Florian Klaempfl
 | 
						|
 | 
						|
    This unit handles the exports parsing
 | 
						|
 | 
						|
    This program is free software; you can redistribute it and/or modify
 | 
						|
    it under the terms of the GNU General Public License as published by
 | 
						|
    the Free Software Foundation; either version 2 of the License, or
 | 
						|
    (at your option) any later version.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU General Public License
 | 
						|
    along with this program; if not, write to the Free Software
 | 
						|
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
 | 
						|
 ****************************************************************************
 | 
						|
}
 | 
						|
unit pexports;
 | 
						|
 | 
						|
  interface
 | 
						|
 | 
						|
    { reads an exports statement in a library }
 | 
						|
    procedure read_exports;
 | 
						|
 | 
						|
  implementation
 | 
						|
 | 
						|
    uses
 | 
						|
      globtype,systems,tokens,
 | 
						|
      strings,cobjects,globals,verbose,
 | 
						|
      scanner,symconst,symtable,pbase,
 | 
						|
      export,GenDef;
 | 
						|
 | 
						|
    procedure read_exports;
 | 
						|
 | 
						|
      var
 | 
						|
         hp : pexported_item;
 | 
						|
         code : integer;
 | 
						|
         DefString:string;
 | 
						|
         ProcName:string;
 | 
						|
         InternalProcName:string;
 | 
						|
      begin
 | 
						|
         DefString:='';
 | 
						|
         InternalProcName:='';
 | 
						|
         consume(_EXPORTS);
 | 
						|
         while true do
 | 
						|
           begin
 | 
						|
              hp:=new(pexported_item,init);
 | 
						|
              if token=_ID then
 | 
						|
                begin
 | 
						|
                   getsym(pattern,true);
 | 
						|
                   if srsym^.typ=unitsym then
 | 
						|
                     begin
 | 
						|
                        consume(_ID);
 | 
						|
                        consume(_POINT);
 | 
						|
                        getsymonlyin(punitsym(srsym)^.unitsymtable,pattern);
 | 
						|
                     end;
 | 
						|
                   consume(_ID);
 | 
						|
                   if assigned(srsym) then
 | 
						|
                     begin
 | 
						|
                        hp^.sym:=srsym;
 | 
						|
                        if ((srsym^.typ<>procsym) or
 | 
						|
                            ((tf_need_export in target_info.flags) and
 | 
						|
                             not(po_exports in pprocdef(pprocsym(srsym)^.definition)^.procoptions)
 | 
						|
                            )
 | 
						|
                           ) and
 | 
						|
                           (srsym^.typ<>varsym) and (srsym^.typ<>typedconstsym) then
 | 
						|
                         Message(parser_e_illegal_symbol_exported)
 | 
						|
                        else
 | 
						|
                         begin
 | 
						|
                          ProcName:=hp^.sym^.name;
 | 
						|
                          InternalProcName:=hp^.sym^.mangledname;
 | 
						|
                          { This is wrong if the first is not
 | 
						|
                            an underline }
 | 
						|
                          if InternalProcName[1]='_' then
 | 
						|
                            delete(InternalProcName,1,1)
 | 
						|
                          else if (target_os.id=os_i386_win32) and UseDeffileForExport then
 | 
						|
                            begin
 | 
						|
                              Message(parser_e_dlltool_unit_var_problem);
 | 
						|
                              Message(parser_e_dlltool_unit_var_problem2);
 | 
						|
                            end;
 | 
						|
                          if length(InternalProcName)<2 then
 | 
						|
                           Message(parser_e_procname_to_short_for_export);
 | 
						|
                          DefString:=ProcName+'='+InternalProcName;
 | 
						|
                         end;
 | 
						|
                        if (idtoken=_INDEX) then
 | 
						|
                          begin
 | 
						|
                             consume(_INDEX);
 | 
						|
                             hp^.options:=hp^.options or eo_index;
 | 
						|
                             val(pattern,hp^.index,code);
 | 
						|
                             consume(_INTCONST);
 | 
						|
                             if target_os.id=os_i386_win32 then
 | 
						|
                               DefString:=ProcName+'='+InternalProcName+' @ '+tostr(hp^.index)
 | 
						|
                             else
 | 
						|
                               DefString:=ProcName+'='+InternalProcName; {Index ignored!}
 | 
						|
                          end;
 | 
						|
                        if (idtoken=_NAME) then
 | 
						|
                          begin
 | 
						|
                             consume(_NAME);
 | 
						|
                             hp^.name:=stringdup(pattern);
 | 
						|
                             hp^.options:=hp^.options or eo_name;
 | 
						|
                             if token=_CCHAR then
 | 
						|
                              consume(_CCHAR)
 | 
						|
                             else
 | 
						|
                              consume(_CSTRING);
 | 
						|
                             DefString:=hp^.name^+'='+InternalProcName;
 | 
						|
                          end;
 | 
						|
                        if (idtoken=_RESIDENT) then
 | 
						|
                          begin
 | 
						|
                             consume(_RESIDENT);
 | 
						|
                             hp^.options:=hp^.options or eo_resident;
 | 
						|
                             DefString:=ProcName+'='+InternalProcName;{Resident ignored!}
 | 
						|
                          end;
 | 
						|
                        if (DefString<>'') and UseDeffileForExport then
 | 
						|
                         DefFile.AddExport(DefString);
 | 
						|
                        if srsym^.typ=procsym then
 | 
						|
                          exportlib^.exportprocedure(hp)
 | 
						|
                        else
 | 
						|
                          begin
 | 
						|
                             exportlib^.exportvar(hp);
 | 
						|
                          end;
 | 
						|
                     end;
 | 
						|
                end
 | 
						|
              else
 | 
						|
                consume(_ID);
 | 
						|
              if token=_COMMA then
 | 
						|
                consume(_COMMA)
 | 
						|
              else
 | 
						|
                break;
 | 
						|
           end;
 | 
						|
         consume(_SEMICOLON);
 | 
						|
        if not DefFile.empty then
 | 
						|
         DefFile.writefile;
 | 
						|
      end;
 | 
						|
 | 
						|
end.
 | 
						|
 | 
						|
{
 | 
						|
  $Log$
 | 
						|
  Revision 1.18  2000-01-07 01:14:28  peter
 | 
						|
    * updated copyright to 2000
 | 
						|
 | 
						|
  Revision 1.17  1999/12/20 23:23:30  pierre
 | 
						|
   + $description $version
 | 
						|
 | 
						|
  Revision 1.16  1999/12/08 10:40:01  pierre
 | 
						|
    + allow use of unit var in exports of DLL for win32
 | 
						|
      by using direct export writing by default instead of use of DEFFILE
 | 
						|
      that does not allow assembler labels that do not
 | 
						|
      start with an underscore.
 | 
						|
      Use -WD to force use of Deffile for Win32 DLL
 | 
						|
 | 
						|
  Revision 1.15  1999/11/22 22:20:43  pierre
 | 
						|
    * Def file syntax for win32 with index corrected
 | 
						|
    * direct output of .edata leads to same indexes
 | 
						|
      (index 5 leads to next export being 6 unless otherwise
 | 
						|
      specified like for enums)
 | 
						|
 | 
						|
  Revision 1.14  1999/11/20 01:19:10  pierre
 | 
						|
    * DLL index used for win32 target with DEF file
 | 
						|
    + DLL initialization/finalization support
 | 
						|
 | 
						|
  Revision 1.13  1999/10/26 12:30:44  peter
 | 
						|
    * const parameter is now checked
 | 
						|
    * better and generic check if a node can be used for assigning
 | 
						|
    * export fixes
 | 
						|
    * procvar equal works now (it never had worked at least from 0.99.8)
 | 
						|
    * defcoll changed to linkedlist with pparaitem so it can easily be
 | 
						|
      walked both directions
 | 
						|
 | 
						|
  Revision 1.12  1999/08/10 12:51:19  pierre
 | 
						|
    * bind_win32_dll removed (Relocsection used instead)
 | 
						|
    * now relocsection is true by default ! (needs dlltool
 | 
						|
      for DLL generation)
 | 
						|
 | 
						|
  Revision 1.11  1999/08/04 13:02:54  jonas
 | 
						|
    * all tokens now start with an underscore
 | 
						|
    * PowerPC compiles!!
 | 
						|
 | 
						|
  Revision 1.10  1999/08/03 22:02:58  peter
 | 
						|
    * moved bitmask constants to sets
 | 
						|
    * some other type/const renamings
 | 
						|
 | 
						|
  Revision 1.9  1999/05/04 21:44:56  florian
 | 
						|
    * changes to compile it with Delphi 4.0
 | 
						|
 | 
						|
  Revision 1.8  1999/03/26 00:05:35  peter
 | 
						|
    * released valintern
 | 
						|
    + deffile is now removed when compiling is finished
 | 
						|
    * ^( compiles now correct
 | 
						|
    + static directive
 | 
						|
    * shrd fixed
 | 
						|
 | 
						|
  Revision 1.7  1999/02/22 02:44:12  peter
 | 
						|
    * ag386bin doesn't use i386.pas anymore
 | 
						|
 | 
						|
  Revision 1.6  1998/12/11 00:03:31  peter
 | 
						|
    + globtype,tokens,version unit splitted from globals
 | 
						|
 | 
						|
  Revision 1.5  1998/11/30 13:26:25  pierre
 | 
						|
    * the code for ordering the exported procs/vars was buggy
 | 
						|
    + added -WB to force binding (Ozerski way of creating DLL)
 | 
						|
      this is off by default as direct writing of .edata section seems
 | 
						|
      OK
 | 
						|
 | 
						|
  Revision 1.4  1998/11/30 09:43:21  pierre
 | 
						|
    * some range check bugs fixed (still not working !)
 | 
						|
    + added DLL writing support for win32 (also accepts variables)
 | 
						|
    + TempAnsi for code that could be used for Temporary ansi strings
 | 
						|
      handling
 | 
						|
 | 
						|
  Revision 1.3  1998/10/29 11:35:51  florian
 | 
						|
    * some dll support for win32
 | 
						|
    * fixed assembler writing for PalmOS
 | 
						|
 | 
						|
  Revision 1.2  1998/09/26 17:45:35  peter
 | 
						|
    + idtoken and only one token table
 | 
						|
 | 
						|
}
 |