write_name_quoted(): make one of the path a counted string.
authorJunio C Hamano <junkio@cox.net>
Tue, 29 Nov 2005 06:55:25 +0000 (22:55 -0800)
committerJunio C Hamano <junkio@cox.net>
Tue, 29 Nov 2005 06:55:25 +0000 (22:55 -0800)
This is to prepare for ls-tree updates.

Signed-off-by: Junio C Hamano <junkio@cox.net>
ls-files.c
ls-tree.c
quote.c
quote.h

index db2288aeee61bf64f30fdcc4b11e91c0cd3038a0..f3f1a6a6633881bf43887731fdcbe08af9ad2f4a 100644 (file)
@@ -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);
        }
 }
index d9f15e349cb833401eea38d21fb050b10f9678d4..d7c7e750fbf08363731e7bafdc6b2b1b058ccc38 100644 (file)
--- 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 e662a7da71e39c1ffc3d1a4bf485fda17df5e907..76eb14426581f03d0b15ee4eb720456a0729d1bc 100644 (file)
--- 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 2486e6e68c2d7fa7bc2f78c18df323cc9adcc894..c1ab3788e6d69318638142ebeffc690318a0489a 100644 (file)
--- 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