diff options
author | Rob Staudinger <robert.staudinger@gmail.com> | 2005-05-04 16:03:17 +0000 |
---|---|---|
committer | Rob Staudinger <robert.staudinger@gmail.com> | 2005-05-04 16:03:17 +0000 |
commit | a62a9ba430220269cacd1c3c2aef5cbfe321c939 (patch) | |
tree | d68ae063810faa7677f22b9297800a1cfdb14bba | |
parent | a330abc9d15b390c0144046fbc0f78579f434cf8 (diff) | |
download | enchant-a62a9ba430220269cacd1c3c2aef5cbfe321c939.tar.gz |
Autopackage support.
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@21039 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | ac-helpers/binreloc.m4 | 77 | ||||
-rw-r--r-- | autopackage/@gtk.org/glib/skeleton.1 | 14 | ||||
-rw-r--r-- | autopackage/@gtk.org/gmodule/skeleton.1 | 14 | ||||
-rw-r--r-- | autopackage/default.apspec.in | 53 | ||||
-rw-r--r-- | configure.in | 6 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/enchant.c | 12 | ||||
-rw-r--r-- | src/prefix.c | 482 | ||||
-rw-r--r-- | src/prefix.h | 139 |
9 files changed, 800 insertions, 3 deletions
diff --git a/ac-helpers/binreloc.m4 b/ac-helpers/binreloc.m4 new file mode 100644 index 0000000..8e44e4e --- /dev/null +++ b/ac-helpers/binreloc.m4 @@ -0,0 +1,77 @@ +# Check for binary relocation support +# Hongli Lai +# http://autopackage.org/ + +AC_DEFUN([AM_BINRELOC], +[ + AC_ARG_ENABLE(binreloc, + [ --enable-binreloc compile with binary relocation support + (default=enable when available)], + enable_binreloc=$enableval,enable_binreloc=auto) + + AC_ARG_ENABLE(binreloc-threads, + [ --enable-binreloc-threads compile binary relocation with threads support + (default=yes)], + enable_binreloc_threads=$enableval,enable_binreloc_threads=yes) + + BINRELOC_CFLAGS= + BINRELOC_LIBS= + if test "x$enable_binreloc" = "xauto"; then + AC_CHECK_FILE([/proc/self/maps]) + AC_CACHE_CHECK([whether everything is installed to the same prefix], + [br_cv_valid_prefixes], [ + if test "$bindir" = '${exec_prefix}/bin' -a "$sbindir" = '${exec_prefix}/sbin' -a \ + "$datadir" = '${prefix}/share' -a "$libdir" = '${exec_prefix}/lib' -a \ + "$libexecdir" = '${exec_prefix}/libexec' -a "$sysconfdir" = '${prefix}/etc' + then + br_cv_valid_prefixes=yes + else + br_cv_valid_prefixes=no + fi + ]) + fi + AC_CACHE_CHECK([whether binary relocation support should be enabled], + [br_cv_binreloc], + [if test "x$enable_binreloc" = "xyes"; then + br_cv_binreloc=yes + elif test "x$enable_binreloc" = "xauto"; then + if test "x$br_cv_valid_prefixes" = "xyes" -a \ + "x$ac_cv_file__proc_self_maps" = "xyes"; then + br_cv_binreloc=yes + else + br_cv_binreloc=no + fi + else + br_cv_binreloc=no + fi]) + + if test "x$br_cv_binreloc" = "xyes"; then + BINRELOC_CFLAGS="-DENABLE_BINRELOC" + AC_DEFINE(ENABLE_BINRELOC,,[Use binary relocation?]) + if test "x$enable_binreloc_threads" = "xyes"; then + AC_CHECK_LIB([pthread], [pthread_getspecific]) + fi + + AC_CACHE_CHECK([whether binary relocation should use threads], + [br_cv_binreloc_threads], + [if test "x$enable_binreloc_threads" = "xyes"; then + if test "x$ac_cv_lib_pthread_pthread_getspecific" = "xyes"; then + br_cv_binreloc_threads=yes + else + br_cv_binreloc_threads=no + fi + else + br_cv_binreloc_threads=no + fi]) + + if test "x$br_cv_binreloc_threads" = "xyes"; then + BINRELOC_LIBS="-lpthread" + AC_DEFINE(BR_PTHREAD,1,[Include pthread support for binary relocation?]) + else + BINRELOC_CFLAGS="$BINRELOC_CFLAGS -DBR_PTHREADS=0" + AC_DEFINE(BR_PTHREAD,0,[Include pthread support for binary relocation?]) + fi + fi + AC_SUBST(BINRELOC_CFLAGS) + AC_SUBST(BINRELOC_LIBS) +]) diff --git a/autopackage/@gtk.org/glib/skeleton.1 b/autopackage/@gtk.org/glib/skeleton.1 new file mode 100644 index 0000000..95ba298 --- /dev/null +++ b/autopackage/@gtk.org/glib/skeleton.1 @@ -0,0 +1,14 @@ +# Package skeleton for glib + +[Meta] +RootName: @gtk.org/glib +DisplayName: The Gtk+ utility library +ShortName: glib +Skeleton-Author: Robert Staudinger <robsta@stereolyzer.net> +Skeleton-Version: 1 + +[Notes] +Does not set SOFTWARE_VERSIONS + +[Test] +INTERFACE_VERSIONS=$( testForLib -i libglib-2.0.so ) diff --git a/autopackage/@gtk.org/gmodule/skeleton.1 b/autopackage/@gtk.org/gmodule/skeleton.1 new file mode 100644 index 0000000..b64d155 --- /dev/null +++ b/autopackage/@gtk.org/gmodule/skeleton.1 @@ -0,0 +1,14 @@ +# Package skeleton for gmodule + +[Meta] +RootName: @gtk.org/gmodule +DisplayName: The Gtk+ dynamic module loader +ShortName: gmodule +Skeleton-Author: Robert Staudinger <robsta@stereolyzer.net> +Skeleton-Version: 1 + +[Notes] +Does not set SOFTWARE_VERSIONS + +[Test] +INTERFACE_VERSIONS=$( testForLib -i libgmodule-2.0.so ) diff --git a/autopackage/default.apspec.in b/autopackage/default.apspec.in new file mode 100644 index 0000000..e3da4d2 --- /dev/null +++ b/autopackage/default.apspec.in @@ -0,0 +1,53 @@ +# -*-shell-script-*- + +[Meta] +RootName: @abisource.org/enchant:@VERSION@ +DisplayName: An Enchanting Spell Checking Library +ShortName: enchant +Maintainer: Dom Lachowicz - http://www.abisource.org/ +Packager: Robert Staudinger <robsta@stereolyzer.net> +Summary: A library that wraps other spell checking backends. +SoftwareVersion: @VERSION@ +AutopackageTarget: 1.0 +PackageVersion: 3 + +# Only uncomment InterfaceVersion if your package exposes interfaces to other software, +# for instance if it includes DSOs or python/perl modules. See the developer guide for more info, +# or ask on autopackage-dev if you don't understand interface versioning in autopackage. + +# FIXME set this automatically +# but VERSION has 3 digits +InterfaceVersion: 1.1 + +[Description] +Enchant is meant to provide a generic interface into various existing +spell checking libaries. These include, but are not limited to: +* Aspell/Pspell +* Ispell +* Hspell +* Uspell + +[BuildPrepare] +prepareBuild --prefix=/bail/if/binreloc/bails --enable-ispell --enable-myspell --enable-aspell --enable-uspell --enable-hspell + +[BuildUnprepare] +unprepareBuild + +[Imports] +echo '*' | import + +[Prepare] +require @gtk.org/glib 0 +require @gtk.org/gmodule 0 + +[Install] +# Put your installation script here +installExe ./bin/* +installLib ./lib/*.so.*.*.* +mkdir -p "$PREFIX/lib/enchant" +mv ./lib/enchant/libenchant_*so* "$PREFIX/lib/enchant" +installMan 1 man/man1/* + +[Uninstall] +rm -R -f "$PREFIX/lib/enchant" +uninstallFromLog diff --git a/configure.in b/configure.in index f250cda..e150e41 100644 --- a/configure.in +++ b/configure.in @@ -65,6 +65,10 @@ esac AC_MSG_RESULT([$native_win32]) AM_CONDITIONAL(OS_WIN32, test "x$native_win32" = "xyes") +dnl binreloc +AM_BINRELOC +AM_CONDITIONAL(WITH_BINRELOC, test "x$br_cv_binreloc" = "xyes") + build_ispell=yes AC_ARG_ENABLE(ispell, [ --disable-ispell enable the ispell backend [default=auto]], build_ispell="$enableval", build_ispell=yes) @@ -242,6 +246,7 @@ src/hspell/Makefile src/applespell/Makefile tests/Makefile doc/Makefile +autopackage/default.apspec ]) dnl =========================================================================================== @@ -257,4 +262,5 @@ $PACKAGE-$VERSION Build Hspell backend: ${build_hspell} Build Myspell backend: ${build_myspell} Build against system Myspell: ${with_system_myspell} + Build with Binreloc $br_cv_binreloc " diff --git a/src/Makefile.am b/src/Makefile.am index 03994de..c50851a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,9 +4,13 @@ INCLUDES=-I$(top_srcdir) $(ENCHANT_CFLAGS) -DENCHANT_GLOBAL_MODULE_DIR=\"$(libdi lib_LTLIBRARIES = libenchant.la +if WITH_BINRELOC +libenchant_la_LIBADD= $(ENCHANT_LIBS) -lpthread +else libenchant_la_LIBADD= $(ENCHANT_LIBS) +endif libenchant_la_LDFLAGS = -version-info $(VERSION_INFO) -no-undefined -libenchant_la_SOURCES = enchant.c enchant.h +libenchant_la_SOURCES = prefix.c enchant.c enchant.h libenchant_includedir = $(includedir)/enchant/ libenchant_include_HEADERS = enchant.h enchant-provider.h enchant++.h diff --git a/src/enchant.c b/src/enchant.c index 9cf0efb..95eb865 100644 --- a/src/enchant.c +++ b/src/enchant.c @@ -53,6 +53,10 @@ #define ENCHANT_USER_PATH_EXTENSION ".enchant" #endif +#ifdef ENABLE_BINRELOC +#include "prefix.h" +#endif + ENCHANT_PLUGIN_DECLARE("Enchant") /********************************************************************************/ @@ -128,7 +132,9 @@ enchant_get_module_dir (void) if (module_dir) return module_dir; -#ifdef ENCHANT_GLOBAL_MODULE_DIR +#ifdef ENABLE_BINRELOC + return g_strdup (BR_LIBDIR ("/enchant")); +#elif ENCHANT_GLOBAL_MODULE_DIR return g_strdup (ENCHANT_GLOBAL_MODULE_DIR); #else return NULL; @@ -147,7 +153,9 @@ enchant_get_conf_dir (void) if (ordering_dir) return ordering_dir; -#ifdef ENCHANT_GLOBAL_ORDERING +#ifdef ENABLE_BINRELOC + return g_strdup (BR_DATADIR ("/enchant")); +#elif ENCHANT_GLOBAL_ORDERING return g_strdup (ENCHANT_GLOBAL_ORDERING); #else return NULL; diff --git a/src/prefix.c b/src/prefix.c new file mode 100644 index 0000000..976c980 --- /dev/null +++ b/src/prefix.c @@ -0,0 +1,482 @@ +/* + * BinReloc - a library for creating relocatable executables + * Written by: Mike Hearn <mike@theoretic.com> + * Hongli Lai <h.lai@chello.nl> + * http://autopackage.org/ + * + * This source code is public domain. You can relicense this code + * under whatever license you want. + * + * NOTE: if you're using C++ and are getting "undefined reference + * to br_*", try renaming prefix.c to prefix.cpp + */ + +/* WARNING, BEFORE YOU MODIFY PREFIX.C: + * + * If you make changes to any of the functions in prefix.c, you MUST + * change the BR_NAMESPACE macro (in prefix.h). + * This way you can avoid symbol table conflicts with other libraries + * that also happen to use BinReloc. + * + * Example: + * #define BR_NAMESPACE(funcName) foobar_ ## funcName + * --> expands br_locate to foobar_br_locate + */ + +#ifndef _PREFIX_C_ +#define _PREFIX_C_ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#ifndef BR_PTHREADS + /* Change 1 to 0 if you don't want pthread support */ + #define BR_PTHREADS 1 +#endif /* BR_PTHREADS */ + +#include <stdlib.h> +#include <stdio.h> +#include <limits.h> +#include <string.h> +#include "prefix.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#undef NULL +#define NULL ((void *) 0) + +#ifdef __GNUC__ + #define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;} +#else + #define br_return_val_if_fail(expr,val) if (!(expr)) return val +#endif /* __GNUC__ */ + + +static br_locate_fallback_func fallback_func = NULL; +static void *fallback_data = NULL; + + +#ifdef ENABLE_BINRELOC +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/param.h> +#include <unistd.h> + + +/** + * br_locate: + * symbol: A symbol that belongs to the app/library you want to locate. + * Returns: A newly allocated string containing the full path of the + * app/library that func belongs to, or NULL on error. This + * string should be freed when not when no longer needed. + * + * Finds out to which application or library symbol belongs, then locate + * the full path of that application or library. + * Note that symbol cannot be a pointer to a function. That will not work. + * + * Example: + * --> main.c + * #include "prefix.h" + * #include "libfoo.h" + * + * int main (int argc, char *argv[]) { + * printf ("Full path of this app: %s\n", br_locate (&argc)); + * libfoo_start (); + * return 0; + * } + * + * --> libfoo.c starts here + * #include "prefix.h" + * + * void libfoo_start () { + * --> "" is a symbol that belongs to libfoo (because it's called + * --> from libfoo_start()); that's why this works. + * printf ("libfoo is located in: %s\n", br_locate ("")); + * } + */ +char * +br_locate (void *symbol) +{ + char line[5000]; + FILE *f; + char *path; + + br_return_val_if_fail (symbol != NULL, NULL); + + f = fopen ("/proc/self/maps", "r"); + if (!f) { + if (fallback_func) + return fallback_func(symbol, fallback_data); + else + return NULL; + } + + while (!feof (f)) + { + unsigned long start, end; + + if (!fgets (line, sizeof (line), f)) + continue; + if (!strstr (line, " r-xp ") || !strchr (line, '/')) + continue; + + sscanf (line, "%lx-%lx ", &start, &end); + if (symbol >= (void *) start && symbol < (void *) end) + { + char *tmp; + size_t len; + + /* Extract the filename; it is always an absolute path */ + path = strchr (line, '/'); + + /* Get rid of the newline */ + tmp = strrchr (path, '\n'); + if (tmp) *tmp = 0; + + /* Get rid of "(deleted)" */ + len = strlen (path); + if (len > 10 && strcmp (path + len - 10, " (deleted)") == 0) + { + tmp = path + len - 10; + *tmp = 0; + } + + fclose(f); + return strdup (path); + } + } + + fclose (f); + return NULL; +} + + +/** + * br_locate_prefix: + * symbol: A symbol that belongs to the app/library you want to locate. + * Returns: A prefix. This string should be freed when no longer needed. + * + * Locates the full path of the app/library that symbol belongs to, and return + * the prefix of that path, or NULL on error. + * Note that symbol cannot be a pointer to a function. That will not work. + * + * Example: + * --> This application is located in /usr/bin/foo + * br_locate_prefix (&argc); --> returns: "/usr" + */ +char * +br_locate_prefix (void *symbol) +{ + char *path, *prefix; + + br_return_val_if_fail (symbol != NULL, NULL); + + path = br_locate (symbol); + if (!path) return NULL; + + prefix = br_extract_prefix (path); + free (path); + return prefix; +} + + +/** + * br_prepend_prefix: + * symbol: A symbol that belongs to the app/library you want to locate. + * path: The path that you want to prepend the prefix to. + * Returns: The new path, or NULL on error. This string should be freed when no + * longer needed. + * + * Gets the prefix of the app/library that symbol belongs to. Prepend that prefix to path. + * Note that symbol cannot be a pointer to a function. That will not work. + * + * Example: + * --> The application is /usr/bin/foo + * br_prepend_prefix (&argc, "/share/foo/data.png"); --> Returns "/usr/share/foo/data.png" + */ +char * +br_prepend_prefix (void *symbol, char *path) +{ + char *tmp, *newpath; + + br_return_val_if_fail (symbol != NULL, NULL); + br_return_val_if_fail (path != NULL, NULL); + + tmp = br_locate_prefix (symbol); + if (!tmp) return NULL; + + if (strcmp (tmp, "/") == 0) + newpath = strdup (path); + else + newpath = br_strcat (tmp, path); + + /* Get rid of compiler warning ("br_prepend_prefix never used") */ + if (0) br_prepend_prefix (NULL, NULL); + + free (tmp); + return newpath; +} + +#endif /* ENABLE_BINRELOC */ + + +/* Pthread stuff for thread safetiness */ +#if BR_PTHREADS && defined(ENABLE_BINRELOC) + +#include <pthread.h> + +static pthread_key_t br_thread_key; +static pthread_once_t br_thread_key_once = PTHREAD_ONCE_INIT; + + +static void +br_thread_local_store_fini () +{ + char *specific; + + specific = (char *) pthread_getspecific (br_thread_key); + if (specific) + { + free (specific); + pthread_setspecific (br_thread_key, NULL); + } + pthread_key_delete (br_thread_key); + br_thread_key = 0; +} + + +static void +br_str_free (void *str) +{ + if (str) + free (str); +} + + +static void +br_thread_local_store_init () +{ + if (pthread_key_create (&br_thread_key, br_str_free) == 0) + atexit (br_thread_local_store_fini); +} + +#else /* BR_PTHREADS */ +#ifdef ENABLE_BINRELOC + +static char *br_last_value = (char *) NULL; + +static void +br_free_last_value () +{ + if (br_last_value) + free (br_last_value); +} + +#endif /* ENABLE_BINRELOC */ +#endif /* BR_PTHREADS */ + + +#ifdef ENABLE_BINRELOC + +/** + * br_thread_local_store: + * str: A dynamically allocated string. + * Returns: str. This return value must not be freed. + * + * Store str in a thread-local variable and return str. The next + * you run this function, that variable is freed too. + * This function is created so you don't have to worry about freeing + * strings. Just be careful about doing this sort of thing: + * + * some_function( BR_DATADIR("/one.png"), BR_DATADIR("/two.png") ) + * + * Examples: + * char *foo; + * foo = br_thread_local_store (strdup ("hello")); --> foo == "hello" + * foo = br_thread_local_store (strdup ("world")); --> foo == "world"; "hello" is now freed. + */ +const char * +br_thread_local_store (char *str) +{ + #if BR_PTHREADS + char *specific; + + pthread_once (&br_thread_key_once, br_thread_local_store_init); + + specific = (char *) pthread_getspecific (br_thread_key); + br_str_free (specific); + pthread_setspecific (br_thread_key, str); + + #else /* BR_PTHREADS */ + static int initialized = 0; + + if (!initialized) + { + atexit (br_free_last_value); + initialized = 1; + } + + if (br_last_value) + free (br_last_value); + br_last_value = str; + #endif /* BR_PTHREADS */ + + return (const char *) str; +} + +#endif /* ENABLE_BINRELOC */ + + +/** + * br_strcat: + * str1: A string. + * str2: Another string. + * Returns: A newly-allocated string. This string should be freed when no longer needed. + * + * Concatenate str1 and str2 to a newly allocated string. + */ +char * +br_strcat (const char *str1, const char *str2) +{ + char *result; + size_t len1, len2; + + if (!str1) str1 = ""; + if (!str2) str2 = ""; + + len1 = strlen (str1); + len2 = strlen (str2); + + result = (char *) malloc (len1 + len2 + 1); + memcpy (result, str1, len1); + memcpy (result + len1, str2, len2); + result[len1 + len2] = '\0'; + + return result; +} + + +/* Emulates glibc's strndup() */ +static char * +br_strndup (char *str, size_t size) +{ + char *result = (char *) NULL; + size_t len; + + br_return_val_if_fail (str != (char *) NULL, (char *) NULL); + + len = strlen (str); + if (!len) return strdup (""); + if (size > len) size = len; + + result = (char *) calloc (sizeof (char), len + 1); + memcpy (result, str, size); + return result; +} + + +/** + * br_extract_dir: + * path: A path. + * Returns: A directory name. This string should be freed when no longer needed. + * + * Extracts the directory component of path. Similar to g_dirname() or the dirname + * commandline application. + * + * Example: + * br_extract_dir ("/usr/local/foobar"); --> Returns: "/usr/local" + */ +char * +br_extract_dir (const char *path) +{ + char *end, *result; + + br_return_val_if_fail (path != (char *) NULL, (char *) NULL); + + end = strrchr (path, '/'); + if (!end) return strdup ("."); + + while (end > path && *end == '/') + end--; + result = br_strndup ((char *) path, end - path + 1); + if (!*result) + { + free (result); + return strdup ("/"); + } else + return result; +} + + +/** + * br_extract_prefix: + * path: The full path of an executable or library. + * Returns: The prefix, or NULL on error. This string should be freed when no longer needed. + * + * Extracts the prefix from path. This function assumes that your executable + * or library is installed in an LSB-compatible directory structure. + * + * Example: + * br_extract_prefix ("/usr/bin/gnome-panel"); --> Returns "/usr" + * br_extract_prefix ("/usr/local/lib/libfoo.so"); --> Returns "/usr/local" + * br_extract_prefix ("/usr/local/libfoo.so"); --> Returns "/usr" + */ +char * +br_extract_prefix (const char *path) +{ + char *end, *tmp, *result; + + br_return_val_if_fail (path != (char *) NULL, (char *) NULL); + + if (!*path) return strdup ("/"); + end = strrchr (path, '/'); + if (!end) return strdup (path); + + tmp = br_strndup ((char *) path, end - path); + if (!*tmp) + { + free (tmp); + return strdup ("/"); + } + end = strrchr (tmp, '/'); + if (!end) return tmp; + + result = br_strndup (tmp, end - tmp); + free (tmp); + + if (!*result) + { + free (result); + result = strdup ("/"); + } + + return result; +} + + +/** + * br_set_fallback_function: + * func: A function to call to find the binary. + * data: User data to pass to func. + * + * Sets a function to call to find the path to the binary, in + * case "/proc/self/maps" can't be opened. The function set should + * return a string that is safe to free with free(). + */ +void +br_set_locate_fallback_func (br_locate_fallback_func func, void *data) +{ + fallback_func = func; + fallback_data = data; +} + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PREFIX_C */ diff --git a/src/prefix.h b/src/prefix.h new file mode 100644 index 0000000..9e1b219 --- /dev/null +++ b/src/prefix.h @@ -0,0 +1,139 @@ +/* + * BinReloc - a library for creating relocatable executables + * Written by: Mike Hearn <mike@theoretic.com> + * Hongli Lai <h.lai@chello.nl> + * http://autopackage.org/ + * + * This source code is public domain. You can relicense this code + * under whatever license you want. + * + * See http://autopackage.org/docs/binreloc/ for + * more information and how to use this. + * + * NOTE: if you're using C++ and are getting "undefined reference + * to br_*", try renaming prefix.c to prefix.cpp + */ + +#ifndef _PREFIX_H_ +#define _PREFIX_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* WARNING, BEFORE YOU MODIFY PREFIX.C: + * + * If you make changes to any of the functions in prefix.c, you MUST + * change the BR_NAMESPACE macro. + * This way you can avoid symbol table conflicts with other libraries + * that also happen to use BinReloc. + * + * Example: + * #define BR_NAMESPACE(funcName) foobar_ ## funcName + * --> expands br_locate to foobar_br_locate + */ +#undef BR_NAMESPACE +#define BR_NAMESPACE(funcName) funcName + + +#ifdef ENABLE_BINRELOC + +#define br_thread_local_store BR_NAMESPACE(br_thread_local_store) +#define br_locate BR_NAMESPACE(br_locate) +#define br_locate_prefix BR_NAMESPACE(br_locate_prefix) +#define br_prepend_prefix BR_NAMESPACE(br_prepend_prefix) + +#ifndef BR_NO_MACROS + /* These are convience macros that replace the ones usually used + in Autoconf/Automake projects */ + #undef SELFPATH + #undef PREFIX + #undef PREFIXDIR + #undef BINDIR + #undef SBINDIR + #undef DATADIR + #undef LIBDIR + #undef LIBEXECDIR + #undef ETCDIR + #undef SYSCONFDIR + #undef CONFDIR + #undef LOCALEDIR + + #define SELFPATH (br_thread_local_store (br_locate ((void *) ""))) + #define PREFIX (br_thread_local_store (br_locate_prefix ((void *) ""))) + #define PREFIXDIR (br_thread_local_store (br_locate_prefix ((void *) ""))) + #define BINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/bin"))) + #define SBINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/sbin"))) + #define DATADIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share"))) + #define LIBDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/lib"))) + #define LIBEXECDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/libexec"))) + #define ETCDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) + #define SYSCONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) + #define CONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) + #define LOCALEDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share/locale"))) +#endif /* BR_NO_MACROS */ + + +/* The following functions are used internally by BinReloc + and shouldn't be used directly in applications. */ + +char *br_locate (void *symbol); +char *br_locate_prefix (void *symbol); +char *br_prepend_prefix (void *symbol, char *path); + +#endif /* ENABLE_BINRELOC */ + +const char *br_thread_local_store (char *str); + + +/* These macros and functions are not guarded by the ENABLE_BINRELOC + * macro because they are portable. You can use these functions. + */ + +#define br_strcat BR_NAMESPACE(br_strcat) +#define br_extract_dir BR_NAMESPACE(br_extract_dir) +#define br_extract_prefix BR_NAMESPACE(br_extract_prefix) +#define br_set_locate_fallback_func BR_NAMESPACE(br_set_locate_fallback_func) + +#ifndef BR_NO_MACROS + #ifndef ENABLE_BINRELOC + #define BR_SELFPATH(suffix) SELFPATH suffix + #define BR_PREFIX(suffix) PREFIX suffix + #define BR_PREFIXDIR(suffix) BR_PREFIX suffix + #define BR_BINDIR(suffix) BINDIR suffix + #define BR_SBINDIR(suffix) SBINDIR suffix + #define BR_DATADIR(suffix) DATADIR suffix + #define BR_LIBDIR(suffix) LIBDIR suffix + #define BR_LIBEXECDIR(suffix) LIBEXECDIR suffix + #define BR_ETCDIR(suffix) ETCDIR suffix + #define BR_SYSCONFDIR(suffix) SYSCONFDIR suffix + #define BR_CONFDIR(suffix) CONFDIR suffix + #define BR_LOCALEDIR(suffix) LOCALEDIR suffix + #else + #define BR_SELFPATH(suffix) (br_thread_local_store (br_strcat (SELFPATH, suffix))) + #define BR_PREFIX(suffix) (br_thread_local_store (br_strcat (PREFIX, suffix))) + #define BR_PREFIXDIR(suffix) (br_thread_local_store (br_strcat (BR_PREFIX, suffix))) + #define BR_BINDIR(suffix) (br_thread_local_store (br_strcat (BINDIR, suffix))) + #define BR_SBINDIR(suffix) (br_thread_local_store (br_strcat (SBINDIR, suffix))) + #define BR_DATADIR(suffix) (br_thread_local_store (br_strcat (DATADIR, suffix))) + #define BR_LIBDIR(suffix) (br_thread_local_store (br_strcat (LIBDIR, suffix))) + #define BR_LIBEXECDIR(suffix) (br_thread_local_store (br_strcat (LIBEXECDIR, suffix))) + #define BR_ETCDIR(suffix) (br_thread_local_store (br_strcat (ETCDIR, suffix))) + #define BR_SYSCONFDIR(suffix) (br_thread_local_store (br_strcat (SYSCONFDIR, suffix))) + #define BR_CONFDIR(suffix) (br_thread_local_store (br_strcat (CONFDIR, suffix))) + #define BR_LOCALEDIR(suffix) (br_thread_local_store (br_strcat (LOCALEDIR, suffix))) + #endif +#endif + +char *br_strcat (const char *str1, const char *str2); +char *br_extract_dir (const char *path); +char *br_extract_prefix(const char *path); +typedef char *(*br_locate_fallback_func) (void *symbol, void *data); +void br_set_locate_fallback_func (br_locate_fallback_func func, void *data); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PREFIX_H_ */ |