Patch title: Release 87 bulk changes
Abstract:
File: /pliant/language/os/dll.c
Key:
    Removed line
    Added line
   
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


  void * _EXTERNAL_ dlopen(const char *filename,int flag);
  #define RTLD_LAZY 1
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


  void * _EXTERNAL_ dlopen(const char *filename,int flag);
  #define RTLD_LAZY 1
  #define RTLD_NOW 2
  #define RTLD_GLOBAL 0x100
  void * _EXTERNAL_ dlsym(void *,const char *);
  int _EXTERNAL_ dlclose(void *);
  #if defined(_SO1_) && !defined(_DLL_)
    void * _EXTERNAL_ malloc(unsigned int size) { return mem
    void  _EXTERNAL_ free(void *adr) { memory_free(adr); }
  #endif

  FUNCTION Address external_function_address(struct Str *dll
    struct Str namez;
    void *handle; void *fn;
    Str_build(&namez); Str_concat(&namez,S,dllname,EOS);
  void * _EXTERNAL_ dlsym(void *,const char *);
  int _EXTERNAL_ dlclose(void *);
  #if defined(_SO1_) && !defined(_DLL_)
    void * _EXTERNAL_ malloc(unsigned int size) { return mem
    void  _EXTERNAL_ free(void *adr) { memory_free(adr); }
  #endif

  FUNCTION Address external_function_address(struct Str *dll
    struct Str namez;
    void *handle; void *fn;
    Str_build(&namez); Str_concat(&namez,S,dllname,EOS);
    handle=dlopen(namez.chars,RTLD_LAZY);
    // handle=dlopen(namez.chars,RTLD_LAZY);
    handle=dlopen(namez.chars,RTLD_NOW|RTLD_GLOBAL);
    Str_destroy(&namez);
    if(handle==null) {
  #if defined(_OpenBSD_)  /* don't lie */
      error_notifyn(error_id_missing,Z,"Failed to load share
  #else
      error_notifyn(error_id_missing,Z,"Failed to load ELF D
  #endif
      return null; }
    Str_build(&namez);
  #if defined(_OpenBSD_)
    Str_concat(&namez,Z,"_",S,funname,EOS);
  #else
    Str_concat(&namez,S,funname,EOS);
  #endif
    fn=dlsym(handle,namez.chars);
    Str_destroy(&namez);
    if(fn==null) {
  #if defined(_OpenBSD_)  /* don't lie */
      error_notifyn(error_id_missing,Z,"Could not find funct
  #else
      error_notifyn(error_id_missing,Z,"Could not find funct
  #endif
      return null; }
    return fn; }


    Str_destroy(&namez);
    if(handle==null) {
  #if defined(_OpenBSD_)  /* don't lie */
      error_notifyn(error_id_missing,Z,"Failed to load share
  #else
      error_notifyn(error_id_missing,Z,"Failed to load ELF D
  #endif
      return null; }
    Str_build(&namez);
  #if defined(_OpenBSD_)
    Str_concat(&namez,Z,"_",S,funname,EOS);
  #else
    Str_concat(&namez,S,funname,EOS);
  #endif
    fn=dlsym(handle,namez.chars);
    Str_destroy(&namez);
    if(fn==null) {
  #if defined(_OpenBSD_)  /* don't lie */
      error_notifyn(error_id_missing,Z,"Could not find funct
  #else
      error_notifyn(error_id_missing,Z,"Could not find funct
  #endif
      return null; }
    return fn; }