> 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