[PATCH util/makedepend V2] Quote colons in filenames/paths

Walter Harms wharms at bfs.de
Sun May 6 18:14:52 UTC 2018



> Alan Coopersmith <alan.coopersmith at oracle.com> hat am 5. Mai 2018 um 20:11
> geschrieben:
> 
> 
> From: Antonio Larrosa <alarrosa at suse.com>
> 
> Makefile doesn't like colons in filenames/paths so they must
> be quoted in the output. Otherwise makedepend doesn't work with
> full paths that contain a colon.
> 
> V2: Use quoted filename when measuring name length
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
>  pr.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 44 insertions(+), 4 deletions(-)
> 
> diff --git a/pr.c b/pr.c
> index 04abef9..9a49635 100644
> --- a/pr.c
> +++ b/pr.c
> @@ -63,25 +63,65 @@ add_include(struct filepointer *filep, struct inclist
> *file,
>  	}
>  }
>  
> +/**
> + * Replaces all ":" occurrences in @p input with "\:" using @p outputbuffer
> (of size @p bufsize)
> + * possibly to hold the result. @p returns the string with quoted colons
> + */
> +static const char *
> +quoteColons(const char *input, char *outputbuffer, size_t bufsize)
> +{
> +        const char *tmp=input;
> +        const char *loc;
> +        char *output=outputbuffer;
> +
> +        loc = strchr(input, ':');
> +        if (loc == NULL) {
> +                return input;
> +        }
> +
> +        tmp=input;
> +        while (loc != NULL && bufsize > loc-tmp+2 ) {
> +                memcpy(output, tmp, loc-tmp);
> +                output+=loc-tmp;
> +                bufsize-=loc-tmp+2;
> +                tmp=loc+1;
> +                *output='\\';
> +                output++;
> +                *output=':';
> +                output++;
> +                loc = strchr(tmp, ':');
> +        }
> +
> +        if (strlen(tmp) <= bufsize)
> +           strcpy(output, tmp);
> +        else {
> +           strncpy(output, tmp, bufsize-1);
> +           output[bufsize]=0;
> +        }
> +        return outputbuffer;
> +}
> +
hi,
i am sure that this is a very fast code but ..
do you not thing it would be better to use a more simple solution ?
like:

        for( ; *s ; s++) {
                if (*s == ':')
                        *d++='\\';
                *d++=*s;
        }
        *d=*s;
or did i miss a trick here ?

To avoid a const size buffer you could simply add:
char d[strlen(ip->i_file)*2+1];

and return strdup(d);

BTW why 
 fwrite(buf, len, 1, stdout);

Is there a loop that i am missing ? Otherwise a simple printf()
would do instead of snprinft()

just my 2 cents,
re,
 wh

>  static void
>  pr(struct inclist *ip, const char *file, const char *base)
>  {
>  	static const char *lastfile;
>  	static int	current_len;
>  	register int	len, i;
> +	const char *	quoted;
>  	char	buf[ BUFSIZ ];
> +	char	quotebuf[ BUFSIZ ];
>  
>  	printed = TRUE;
> -	len = strlen(ip->i_file)+1;
> +	quoted = quoteColons(ip->i_file, quotebuf, sizeof(quotebuf));
> +	len = strlen(quoted)+1;
>  	if (current_len + len > width || file != lastfile) {
>  		lastfile = file;
>  		snprintf(buf, sizeof(buf), "\n%s%s%s: %s",
> -			 objprefix, base, objsuffix, ip->i_file);
> +			 objprefix, base, objsuffix, quoted);
>  		len = current_len = strlen(buf);
>  	}
>  	else {
> -		buf[0] = ' ';
> -		strcpy(buf+1, ip->i_file);
> +		snprintf(buf, sizeof(buf), " %s", quoted);
>  		current_len += len;
>  	}
>  	fwrite(buf, len, 1, stdout);
> -- 
> 2.15.0
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list