From 9ef2b3cbf62d15aa0312bde349347873d7c0f399 Mon Sep 17 00:00:00 2001
From: Junio C Hamano <junkio@cox.net>
Date: Mon, 28 Nov 2005 22:55:25 -0800
Subject: [PATCH] write_name_quoted(): make one of the path a counted string.

This is to prepare for ls-tree updates.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 ls-files.c |  8 +++++---
 ls-tree.c  |  4 +++-
 quote.c    | 29 +++++++++++++++++++----------
 quote.h    |  4 ++--
 4 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/ls-files.c b/ls-files.c
index db2288aeee..f3f1a6a663 100644
--- a/ls-files.c
+++ b/ls-files.c
@@ -344,7 +344,7 @@ static void show_dir_entry(const char *tag, struct nond_on_fs *ent)
 		return;
 
 	fputs(tag, stdout);
-	write_name_quoted("", ent->name + offset, line_terminator, stdout);
+	write_name_quoted("", 0, ent->name + offset, line_terminator, stdout);
 	putchar(line_terminator);
 }
 
@@ -433,7 +433,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
 
 	if (!show_stage) {
 		fputs(tag, stdout);
-		write_name_quoted("", ce->name + offset, line_terminator, stdout);
+		write_name_quoted("", 0, ce->name + offset,
+				  line_terminator, stdout);
 		putchar(line_terminator);
 	}
 	else {
@@ -442,7 +443,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
 		       ntohl(ce->ce_mode),
 		       sha1_to_hex(ce->sha1),
 		       ce_stage(ce));
-		write_name_quoted("", ce->name + offset, line_terminator, stdout);
+		write_name_quoted("", 0, ce->name + offset,
+				  line_terminator, stdout);
 		putchar(line_terminator);
 	}
 }
diff --git a/ls-tree.c b/ls-tree.c
index d9f15e349c..d7c7e750fb 100644
--- a/ls-tree.c
+++ b/ls-tree.c
@@ -157,9 +157,11 @@ static int show_entry(struct tree_entry_list *e, int level, char *pathbuf)
 	int err = 0; 
 
 	if (e != &root_entry) {
+		int pathlen = strlen(pathbuf);
 		printf("%06o %s %s	",
 		       e->mode, entry_type(e), entry_hex(e));
-		write_name_quoted(pathbuf, e->name, line_termination, stdout);
+		write_name_quoted(pathbuf, pathlen, e->name,
+				  line_termination, stdout);
 		putchar(line_termination);
 	}
 
diff --git a/quote.c b/quote.c
index e662a7da71..76eb144265 100644
--- a/quote.c
+++ b/quote.c
@@ -112,7 +112,8 @@ char *sq_dequote(char *arg)
  *     but not enclosed in double-quote pair.  Return value is undefined.
  */
 
-int quote_c_style(const char *name, char *outbuf, FILE *outfp, int no_dq)
+static int quote_c_style_counted(const char *name, int namelen,
+				 char *outbuf, FILE *outfp, int no_dq)
 {
 #undef EMIT
 #define EMIT(c) \
@@ -125,7 +126,7 @@ int quote_c_style(const char *name, char *outbuf, FILE *outfp, int no_dq)
 
 	if (!no_dq)
 		EMIT('"');
-	for (sp = name; (ch = *sp++); ) {
+	for (sp = name; (ch = *sp++) && (sp - name) <= namelen; ) {
 
 		if ((ch < ' ') || (ch == '"') || (ch == '\\') ||
 		    (ch == 0177)) {
@@ -162,6 +163,12 @@ int quote_c_style(const char *name, char *outbuf, FILE *outfp, int no_dq)
 	return needquote ? count : 0;
 }
 
+int quote_c_style(const char *name, char *outbuf, FILE *outfp, int no_dq)
+{
+	int cnt = strlen(name);
+	return quote_c_style_counted(name, cnt, outbuf, outfp, no_dq);
+}
+
 /*
  * C-style name unquoting.
  *
@@ -227,28 +234,30 @@ char *unquote_c_style(const char *quoted, const char **endp)
 	}
 }
 
-void write_name_quoted(const char *prefix, const char *name,
-		       int quote, FILE *out)
+void write_name_quoted(const char *prefix, int prefix_len,
+		       const char *name, int quote, FILE *out)
 {
 	int needquote;
 
 	if (!quote) {
 	no_quote:
-		if (prefix && prefix[0])
-			fputs(prefix, out);
+		if (prefix_len)
+			fprintf(out, "%.*s", prefix_len, prefix);
 		fputs(name, out);
 		return;
 	}
 
 	needquote = 0;
-	if (prefix && prefix[0])
-		needquote = quote_c_style(prefix, NULL, NULL, 0);
+	if (prefix_len)
+		needquote = quote_c_style_counted(prefix, prefix_len,
+						  NULL, NULL, 0);
 	if (!needquote)
 		needquote = quote_c_style(name, NULL, NULL, 0);
 	if (needquote) {
 		fputc('"', out);
-		if (prefix && prefix[0])
-			quote_c_style(prefix, NULL, out, 1);
+		if (prefix_len)
+			quote_c_style_counted(prefix, prefix_len,
+					      NULL, out, 1);
 		quote_c_style(name, NULL, out, 1);
 		fputc('"', out);
 	}
diff --git a/quote.h b/quote.h
index 2486e6e68c..c1ab3788e6 100644
--- a/quote.h
+++ b/quote.h
@@ -41,7 +41,7 @@ extern int quote_c_style(const char *name, char *outbuf, FILE *outfp,
 			 int nodq);
 extern char *unquote_c_style(const char *quoted, const char **endp);
 
-extern void write_name_quoted(const char *prefix, const char *name,
-			      int quote, FILE *out);
+extern void write_name_quoted(const char *prefix, int prefix_len,
+			      const char *name, int quote, FILE *out);
 
 #endif
-- 
2.48.1