Mercurial > gnulib
changeset 16909:6b45aca5c4b2 akim/relpath
relpath: do not depend on xalloc.h.
Suggested by Bruno Haible.
* lib/relpath.c (convert_abs_rel): Embrace malloc failures.
Simplify some conditionals.
* lib/relpath.h: Adjust the documentation.
* modules/relpath (Depends-on): Remove xalloc.
author | Akim Demaille <akim@lrde.epita.fr> |
---|---|
date | Mon, 18 Jun 2012 11:41:32 +0200 |
parents | bb4ca9725d0a |
children | |
files | lib/relpath.c lib/relpath.h modules/relpath |
diffstat | 3 files changed, 35 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/relpath.c Wed Jun 13 22:21:57 2012 +0200 +++ b/lib/relpath.c Mon Jun 18 11:41:32 2012 +0200 @@ -31,7 +31,6 @@ #include "dirname.h" #include "error.h" #include "relpath.h" -#include "xalloc.h" #include "pathmax.h" #ifndef PATH_MAX @@ -98,8 +97,7 @@ return false; } -/* Output the relative representation if possible. - If BUF is non NULL, write to that buffer rather than to stdout. */ + bool relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len) { @@ -138,8 +136,8 @@ } else { - buf_err |= buffer_or_output (*fname_suffix ? fname_suffix : ".", - &buf, &len); + buf_err |= buffer_or_output (*fname_suffix ? fname_suffix : ".", + &buf, &len); } if (buf_err) @@ -154,11 +152,27 @@ char * convert_abs_rel (const char *from, const char *target) { - char *realtarget = canonicalize_filename_mode (target, CAN_MISSING); - char *realfrom = canonicalize_filename_mode (from, CAN_MISSING); + char *realtarget = NULL; + char *realfrom = NULL; + char *relative_from = NULL; + char *res = NULL; + + realtarget = canonicalize_filename_mode (target, CAN_MISSING); + if (!realtarget) + goto end; + realfrom = canonicalize_filename_mode (from, CAN_MISSING); + if (!realfrom) + goto end; /* Write to a PATH_MAX buffer. */ - char *relative_from = xmalloc (PATH_MAX); + relative_from = malloc (PATH_MAX); + if (!relative_from) + { + /* It's easier to set errno to ENOMEM than to rely on the + 'malloc-posix' gnulib module. */ + errno = ENOMEM; + goto end; + } /* Get dirname to generate paths relative to. */ realtarget[dir_len (realtarget)] = '\0'; @@ -168,9 +182,14 @@ free (relative_from); relative_from = NULL; } + res = relative_from ? relative_from : xstrdup (from); - free (realtarget); - free (realfrom); - - return relative_from ? relative_from : xstrdup (from); + end: + { + int saved_errno = errno; + free (realtarget); + free (realfrom); + errno = saved_errno; + } + return res; }
--- a/lib/relpath.h Wed Jun 13 22:21:57 2012 +0200 +++ b/lib/relpath.h Mon Jun 18 11:41:32 2012 +0200 @@ -20,13 +20,14 @@ # define _RELPATH_H /* Output the relative representation if possible. - If BUF is non NULL, write to that buffer rather than to stdout. */ + If BUF is non NULL, write to that buffer rather than to stdout. + Return true iff success. */ bool relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len); -/* Return FROM represented as relative to the dir of TARGET. - The result is malloced. */ +/* Return FROM represented as relative to the dir of TARGET. The + result is malloced, or NULL upon error (described by errno). */ char * convert_abs_rel (const char *from, const char *target);