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

Alan Coopersmith alan.coopersmith at oracle.com
Sun May 6 18:33:36 UTC 2018


On 05/ 6/18 11:14 AM, Walter Harms wrote:
> 
> 
>> 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 ?

Antonio will have to answer why he did it that way, I left it since
it seemed to work and didn't look like a problem.

> BTW why 
>  fwrite(buf, len, 1, stdout);
> 
> Is there a loop that i am missing ? Otherwise a simple printf()
> would do instead of snprinft()

That was what the existing code has always done, and it wasn't part of
what Antonio had submitted, but I had the same thought, so put it in a
separate patch:

https://patchwork.freedesktop.org/patch/220801/

-- 
	-Alan Coopersmith-               alan.coopersmith at oracle.com
	 Oracle Solaris Engineering - https://blogs.oracle.com/alanc


More information about the xorg-devel mailing list