[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