| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | {    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;    var      BinaryContainsExports: boolean = false;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       ;    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         BinaryContainsExports:=true;         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                  globalvarsym :                    InternalProcName:=tglobalvarsym(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.
 |