Update from gnulib.
diff --git a/libcharset/lib/ChangeLog b/libcharset/lib/ChangeLog
index 221df04..de9638e 100644
--- a/libcharset/lib/ChangeLog
+++ b/libcharset/lib/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-25 Bruno Haible <bruno@clisp.org>
+
+ * relocatable.h: Update from gnulib.
+ * relocatable.c: Likewise.
+
2009-01-25 Bruno Haible <bruno@clisp.org>
Don't install charset.alias on MacOS X >= 10.3.
diff --git a/libcharset/lib/relocatable.c b/libcharset/lib/relocatable.c
index 5e1dde6..09ff8c9 100644
--- a/libcharset/lib/relocatable.c
+++ b/libcharset/lib/relocatable.c
@@ -1,5 +1,5 @@
/* Provide relocatable packages.
- Copyright (C) 2003-2006 Free Software Foundation, Inc.
+ Copyright (C) 2003-2006, 2008 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify it
@@ -160,17 +160,18 @@
/* Convenience function:
Computes the current installation prefix, based on the original
installation prefix, the original installation directory of a particular
- file, and the current pathname of this file. Returns NULL upon failure. */
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
#ifdef IN_LIBRARY
#define compute_curr_prefix local_compute_curr_prefix
static
#endif
-const char *
+char *
compute_curr_prefix (const char *orig_installprefix,
const char *orig_installdir,
const char *curr_pathname)
{
- const char *curr_installdir;
+ char *curr_installdir;
const char *rel_installdir;
if (curr_pathname == NULL)
@@ -254,8 +255,11 @@
}
if (rp > rel_installdir)
- /* Unexpected: The curr_installdir does not end with rel_installdir. */
- return NULL;
+ {
+ /* Unexpected: The curr_installdir does not end with rel_installdir. */
+ free (curr_installdir);
+ return NULL;
+ }
{
size_t curr_prefix_len = cp - curr_installdir;
@@ -264,11 +268,16 @@
curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
#ifdef NO_XMALLOC
if (curr_prefix == NULL)
- return NULL;
+ {
+ free (curr_installdir);
+ return NULL;
+ }
#endif
memcpy (curr_prefix, curr_installdir, curr_prefix_len);
curr_prefix[curr_prefix_len] = '\0';
+ free (curr_installdir);
+
return curr_prefix;
}
}
@@ -400,7 +409,9 @@
#endif /* PIC */
/* Returns the pathname, relocated according to the current installation
- directory. */
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
const char *
relocate (const char *pathname)
{
@@ -420,15 +431,19 @@
orig_prefix. */
const char *orig_installprefix = INSTALLPREFIX;
const char *orig_installdir = INSTALLDIR;
- const char *curr_prefix_better;
+ char *curr_prefix_better;
curr_prefix_better =
compute_curr_prefix (orig_installprefix, orig_installdir,
get_shared_library_fullname ());
- if (curr_prefix_better == NULL)
- curr_prefix_better = curr_prefix;
- set_relocation_prefix (orig_installprefix, curr_prefix_better);
+ set_relocation_prefix (orig_installprefix,
+ curr_prefix_better != NULL
+ ? curr_prefix_better
+ : curr_prefix);
+
+ if (curr_prefix_better != NULL)
+ free (curr_prefix_better);
initialized = 1;
}
@@ -442,9 +457,19 @@
&& strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
{
if (pathname[orig_prefix_len] == '\0')
- /* pathname equals orig_prefix. */
- return curr_prefix;
- if (ISSLASH (pathname[orig_prefix_len]))
+ {
+ /* pathname equals orig_prefix. */
+ char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ strcpy (result, curr_prefix);
+ return result;
+ }
+ }
+ else if (ISSLASH (pathname[orig_prefix_len]))
{
/* pathname starts with orig_prefix. */
const char *pathname_tail = &pathname[orig_prefix_len];
diff --git a/libcharset/lib/relocatable.h b/libcharset/lib/relocatable.h
index f6d3832..5dfd710 100644
--- a/libcharset/lib/relocatable.h
+++ b/libcharset/lib/relocatable.h
@@ -1,5 +1,5 @@
/* Provide relocatable packages.
- Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2005, 2008 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify it
@@ -49,20 +49,24 @@
const char *curr_prefix);
/* Returns the pathname, relocated according to the current installation
- directory. */
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
extern const char * relocate (const char *pathname);
-/* Memory management: relocate() leaks memory, because it has to construct
- a fresh pathname. If this is a problem because your program calls
- relocate() frequently, think about caching the result. */
+/* Memory management: relocate() potentially allocates memory, because it has
+ to construct a fresh pathname. If this is a problem because your program
+ calls relocate() frequently, think about caching the result. Or free the
+ return value if it was different from the argument pathname. */
/* Convenience function:
Computes the current installation prefix, based on the original
installation prefix, the original installation directory of a particular
- file, and the current pathname of this file. Returns NULL upon failure. */
-extern const char * compute_curr_prefix (const char *orig_installprefix,
- const char *orig_installdir,
- const char *curr_pathname);
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
+extern char * compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname);
#else