On Sun, 11 Sep 2016 23:39:09 +0200
Giuseppe Scrivano <gscriv...@gnu.org> wrote:

> Hi Matthew,
> 
> Matthew White <mehw.is...@inventati.org> writes:
> 
> > +void
> > +replace_metalink_basename (char **name, char *ref)
> > +{
> > +  size_t dir_len = 0;
> > +  char *p, *dir, *file, *new;
> > +
> > +  if (!name)
> > +    return;
> > +
> > +  /* New basename from file name reference.  */
> > +  file = ref;
> > +  if (file)
> > +    {
> > +      p = strrchr (file, '/');
> > +      if (p)
> > +        file = p + 1;
> > +    }
> > +
> > +  /* Old directory.  */
> > +  dir = NULL;
> > +  if (*name)
> > +    {
> > +      p = strrchr (*name, '/');
> > +      if (p)
> > +        dir_len = (p - *name) + 1;
> > +    }
> > +  dir = xstrndup (*name, dir_len);
> 
> I'll review this patch more in details, but one small thing here, could
> we modify name in place and avoid a memory allocation for dir?
> 
> name[dir_len] = '\0';

Function amended to modify *name in place.

Followed Tim's suggestions for Patch 09/25 about different environments 
compatibility, the function now uses last_component() to detect the basename:
http://lists.gnu.org/archive/html/bug-wget/2016-09/msg00083.html

NOTES: if *name is NULL and ref is like 'dir/C:D:file', the result will be 
'C:D:file'; is it advisable to remove the drive letters 'C:D:' and return only 
'file'?

/*
  Replace/remove the basename of a file name.

  The file name is permanently modified.

  Always set NAME to a string, even an empty one.

  Use REF's basename as replacement.  If REF is NULL or if it doesn't
  provide a valid basename candidate, then remove NAME's basename.
*/
void
replace_metalink_basename (char **name, char *ref)
{
  char *new, *basename;

  if (!name)
    return;

  /* Strip old basename.  */
  if (*name)
    {
      basename = last_component (*name);

      if (basename == *name)
        xfree (*name);
      else
        *basename = '\0';
    }

  /* New basename from file name reference.  */
  if (ref)
    ref = last_component (ref);

  /* Replace the old basename.  */
  new = aprintf ("%s%s", *name ? *name : "", ref ? ref : "");
  xfree (*name);
  *name = new;
}

> 
> Giuseppe

Regards,
Matthew

-- 
Matthew White <mehw.is...@inventati.org>

Attachment: pgprJOVF1ZTGo.pgp
Description: PGP signature

Reply via email to