From 9ef2b3cbf62d15aa0312bde349347873d7c0f399 Mon Sep 17 00:00:00 2001 From: Junio C Hamano 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 --- 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 db2288aee..f3f1a6a66 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 d9f15e349..d7c7e750f 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 e662a7da7..76eb14426 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 2486e6e68..c1ab3788e 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.26.2