mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 17:31:42 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			205 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
|     $Id$
 | |
|     Copyright (c) 1998-2002 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;
 | |
| 
 | |
| {$i fpcdefs.inc}
 | |
| 
 | |
| interface
 | |
| 
 | |
|     { reads an exports statement in a library }
 | |
|     procedure read_exports;
 | |
| 
 | |
| 
 | |
| implementation
 | |
| 
 | |
|     uses
 | |
|        { common }
 | |
|        cutils,
 | |
|        { global }
 | |
|        globals,tokens,verbose,
 | |
|        systems,
 | |
|        { symtable }
 | |
|        symconst,symbase,symtype,symsym,
 | |
|        { pass 1 }
 | |
|        node,
 | |
|        ncon,
 | |
|        { parser }
 | |
|        scanner,
 | |
|        pbase,pexpr,
 | |
|        { link }
 | |
|        gendef,export
 | |
| {$ifdef Delphi}
 | |
|        ,dmisc
 | |
|        ,sysutils
 | |
| {$endif}
 | |
|        ;
 | |
| 
 | |
| 
 | |
|     procedure read_exports;
 | |
|       var
 | |
|         hp        : texported_item;
 | |
|         orgs,
 | |
|         DefString : string;
 | |
|         InternalProcName : string;
 | |
|         pt               : tnode;
 | |
|         srsym            : tsym;
 | |
|         srsymtable : tsymtable;
 | |
| 
 | |
|         function IsGreater(hp1,hp2:texported_item):boolean;
 | |
|         var
 | |
|           i2 : boolean;
 | |
|         begin
 | |
|           i2:=(hp2.options and eo_index)<>0;
 | |
|           if (hp1.options and eo_index)<>0 then
 | |
|            begin
 | |
|              if i2 then
 | |
|                IsGreater:=hp1.index>hp2.index
 | |
|              else
 | |
|                IsGreater:=false;
 | |
|            end
 | |
|           else
 | |
|             IsGreater:=i2;
 | |
|         end;
 | |
| 
 | |
|       begin
 | |
|          DefString:='';
 | |
|          InternalProcName:='';
 | |
|          consume(_EXPORTS);
 | |
|          repeat
 | |
|            hp:=texported_item.create;
 | |
|            if token=_ID then
 | |
|              begin
 | |
|                 orgs:=orgpattern;
 | |
|                 consume_sym(srsym,srsymtable);
 | |
|                 hp.sym:=srsym;
 | |
|                 InternalProcName:='';
 | |
|                 case srsym.typ of
 | |
|                   varsym :
 | |
|                     InternalProcName:=tvarsym(srsym).mangledname;
 | |
|                   typedconstsym :
 | |
|                     InternalProcName:=ttypedconstsym(srsym).mangledname;
 | |
|                   procsym :
 | |
|                     begin
 | |
|                       if (Tprocsym(srsym).procdef_count>1) or
 | |
|                          ((tf_need_export in target_info.flags) and
 | |
|                           not(po_exports in tprocsym(srsym).first_procdef.procoptions)) then
 | |
|                         Message(parser_e_illegal_symbol_exported)
 | |
|                       else
 | |
|                         InternalProcName:=tprocsym(srsym).first_procdef.mangledname;
 | |
|                     end;
 | |
|                   else
 | |
|                     Message(parser_e_illegal_symbol_exported)
 | |
|                 end;
 | |
|                 if InternalProcName<>'' then
 | |
|                  begin
 | |
|                    { This is wrong if the first is not
 | |
|                      an underline }
 | |
|                    if InternalProcName[1]='_' then
 | |
|                      delete(InternalProcName,1,1)
 | |
|                    else if (target_info.system in [system_i386_win32,system_i386_wdosx]) and UseDeffileForExports 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:=srsym.realname+'='+InternalProcName;
 | |
|                  end;
 | |
|                 if try_to_consume(_INDEX) then
 | |
|                  begin
 | |
|                    pt:=comp_expr(true);
 | |
|                    if pt.nodetype=ordconstn then
 | |
|                     hp.index:=tordconstnode(pt).value
 | |
|                    else
 | |
|                     begin
 | |
|                       hp.index:=0;
 | |
|                       consume(_INTCONST);
 | |
|                     end;
 | |
|                    hp.options:=hp.options or eo_index;
 | |
|                    pt.free;
 | |
|                    if target_info.system in [system_i386_win32,system_i386_wdosx] then
 | |
|                     DefString:=srsym.realname+'='+InternalProcName+' @ '+tostr(hp.index)
 | |
|                    else
 | |
|                     DefString:=srsym.realname+'='+InternalProcName; {Index ignored!}
 | |
|                  end;
 | |
|                 if try_to_consume(_NAME) then
 | |
|                  begin
 | |
|                    pt:=comp_expr(true);
 | |
|                    if pt.nodetype=stringconstn then
 | |
|                     hp.name:=stringdup(strpas(tstringconstnode(pt).value_str))
 | |
|                    else
 | |
|                     begin
 | |
|                       hp.name:=stringdup('');
 | |
|                       consume(_CSTRING);
 | |
|                     end;
 | |
|                    hp.options:=hp.options or eo_name;
 | |
|                    pt.free;
 | |
|                    DefString:=hp.name^+'='+InternalProcName;
 | |
|                  end;
 | |
|                 if try_to_consume(_RESIDENT) then
 | |
|                  begin
 | |
|                    hp.options:=hp.options or eo_resident;
 | |
|                    DefString:=srsym.realname+'='+InternalProcName;{Resident ignored!}
 | |
|                  end;
 | |
|                 if (DefString<>'') and UseDeffileForExports then
 | |
|                  DefFile.AddExport(DefString);
 | |
|                 { Default to generate a name entry with the provided name }
 | |
|                 if not assigned(hp.name) then
 | |
|                  begin
 | |
|                    hp.name:=stringdup(orgs);
 | |
|                    hp.options:=hp.options or eo_name;
 | |
|                  end;
 | |
|                 if hp.sym.typ=procsym then
 | |
|                   exportlib.exportprocedure(hp)
 | |
|                 else
 | |
|                   exportlib.exportvar(hp);
 | |
|              end
 | |
|            else
 | |
|              consume(_ID);
 | |
|          until not try_to_consume(_COMMA);
 | |
|          consume(_SEMICOLON);
 | |
|         if not DefFile.empty then
 | |
|          DefFile.writefile;
 | |
|       end;
 | |
| 
 | |
| end.
 | |
| 
 | |
| {
 | |
|   $Log$
 | |
|   Revision 1.28  2004-06-20 08:55:30  florian
 | |
|     * logs truncated
 | |
| 
 | |
|   Revision 1.27  2004/06/16 20:07:09  florian
 | |
|     * dwarf branch merged
 | |
| 
 | |
|   Revision 1.26  2004/04/24 17:32:05  peter
 | |
|   index number generation for mixed index-nonindexed fixed, patch by Pavel V. Ozerski
 | |
| 
 | |
|   Revision 1.25.2.1  2004/05/03 14:59:57  peter
 | |
|     * no dlltool needed for win32 linking executables
 | |
| 
 | |
|   Revision 1.25  2004/04/08 11:07:05  michael
 | |
|   indexed exports needs to be sorted (patch from Pavel)
 | |
| 
 | |
| }
 | 
