Skip to content

Commit

Permalink
write_name_quoted(): make one of the path a counted string.
Browse files Browse the repository at this point in the history
This is to prepare for ls-tree updates.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Nov 29, 2005
1 parent ffb1a4b commit 9ef2b3c
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 16 deletions.
8 changes: 5 additions & 3 deletions ls-files.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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 {
Expand All @@ -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);
}
}
Expand Down
4 changes: 3 additions & 1 deletion ls-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
29 changes: 19 additions & 10 deletions quote.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand All @@ -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)) {
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions quote.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 9ef2b3c

Please sign in to comment.