[PATCH] Quote colons in filenames/paths

Antonio Larrosa alarrosa at suse.com
Tue Feb 2 18:31:27 CET 2016


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.
---
 pr.c | 42 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 40 insertions(+), 2 deletions(-)

diff --git a/pr.c b/pr.c
index 04abef9..619be45 100644
--- a/pr.c
+++ b/pr.c
@@ -63,6 +63,43 @@ 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
+ */
+const char *quoteColons(const char *input, char *outputbuffer, int 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)
 {
@@ -70,18 +107,19 @@ pr(struct inclist *ip, const char *file, const char *base)
 	static int	current_len;
 	register int	len, i;
 	char	buf[ BUFSIZ ];
+	char	quotebuf[ BUFSIZ ];
 
 	printed = TRUE;
 	len = strlen(ip->i_file)+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, quoteColons(ip->i_file, quotebuf, sizeof(quotebuf)));
 		len = current_len = strlen(buf);
 	}
 	else {
 		buf[0] = ' ';
-		strcpy(buf+1, ip->i_file);
+		strcpy(buf+1, quoteColons(ip->i_file, quotebuf, sizeof(quotebuf)));
 		current_len += len;
 	}
 	fwrite(buf, len, 1, stdout);
-- 
2.1.4



More information about the xorg-devel mailing list