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

Alan Coopersmith alan.coopersmith at oracle.com
Sat May 5 18:11:26 UTC 2018


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;
+}
+
 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



More information about the xorg-devel mailing list