> Alan Coopersmith <alan.coopersm...@oracle.com> hat am 5. Mai 2018 um 20:11
> geschrieben:
> 
> 
> From: Antonio Larrosa <alarr...@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.coopersm...@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@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to