Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22.  * OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25.  
  26. #ifndef DLOPEN_H
  27. #define DLOPEN_H
  28.  
  29. /**
  30.  * Wrapper functions for dlopen(), dlsym(), dlclose().
  31.  * Note that the #ifdef tests for various environments should be expanded.
  32.  */
  33.  
  34. #if defined(HAVE_DLOPEN)
  35. #include <dlfcn.h>
  36. #endif
  37. #if defined(_WIN32)
  38. #include <windows.h>
  39. #endif
  40.  
  41. typedef void (*GenericFunc)(void);
  42.  
  43. /**
  44.  * Wrapper for dlopen().
  45.  * Note that 'flags' isn't used at this time.
  46.  */
  47. static inline void *
  48. _mesa_dlopen(const char *libname, int flags)
  49. {
  50. #if defined(__blrts)
  51.    return NULL;
  52. #elif defined(HAVE_DLOPEN)
  53.    flags = RTLD_LAZY | RTLD_GLOBAL; /* Overriding flags at this time */
  54.    return dlopen(libname, flags);
  55. #elif defined(__MINGW32__)
  56.    return LoadLibraryA(libname);
  57. #else
  58.    return NULL;
  59. #endif
  60. }
  61.  
  62. /**
  63.  * Wrapper for dlsym() that does a cast to a generic function type,
  64.  * rather than a void *.  This reduces the number of warnings that are
  65.  * generated.
  66.  */
  67. static inline GenericFunc
  68. _mesa_dlsym(void *handle, const char *fname)
  69. {
  70.    union {
  71.       void *v;
  72.       GenericFunc f;
  73.    } u;
  74. #if defined(__blrts)
  75.    u.v = NULL;
  76. #elif defined(__DJGPP__)
  77.    /* need '_' prefix on symbol names */
  78.    char fname2[1000];
  79.    fname2[0] = '_';
  80.    strncpy(fname2 + 1, fname, 998);
  81.    fname2[999] = 0;
  82.    u.v = dlsym(handle, fname2);
  83. #elif defined(HAVE_DLOPEN)
  84.    u.v = dlsym(handle, fname);
  85. #elif defined(__MINGW32__)
  86.    u.v = (void *) GetProcAddress(handle, fname);
  87. #else
  88.    u.v = NULL;
  89. #endif
  90.    return u.f;
  91. }
  92.  
  93. /**
  94.  * Wrapper for dlclose().
  95.  */
  96. static inline void
  97. _mesa_dlclose(void *handle)
  98. {
  99. #if defined(__blrts)
  100.    (void) handle;
  101. #elif defined(HAVE_DLOPEN)
  102.    dlclose(handle);
  103. #elif defined(__MINGW32__)
  104.    FreeLibrary(handle);
  105. #else
  106.    (void) handle;
  107. #endif
  108. }
  109.  
  110. #endif
  111.