[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