Skip to content

Commit

Permalink
builtin-name-rev.c: split deeply nested part from the main function
Browse files Browse the repository at this point in the history
The main function of this command implementation tries to do too many
things.  Split out a handling of single input line into a separate
function to reduce nesting level and clutter.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Aug 2, 2008
1 parent e124554 commit e8b55fa
Showing 1 changed file with 41 additions and 37 deletions.
78 changes: 41 additions & 37 deletions builtin-name-rev.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,45 @@ static char const * const name_rev_usage[] = {
NULL
};

static void name_rev_line(char *p, struct name_ref_data *data)
{
int forty = 0;
char *p_start;
for (p_start = p; *p; p++) {
#define ishex(x) (isdigit((x)) || ((x) >= 'a' && (x) <= 'f'))
if (!ishex(*p))
forty = 0;
else if (++forty == 40 &&
!ishex(*(p+1))) {
unsigned char sha1[40];
const char *name = NULL;
char c = *(p+1);

forty = 0;

*(p+1) = 0;
if (!get_sha1(p - 39, sha1)) {
struct object *o =
lookup_object(sha1);
if (o)
name = get_rev_name(o);
}
*(p+1) = c;

if (!name)
continue;

fwrite(p_start, p - p_start + 1, 1, stdout);
printf(" (%s)", name);
p_start = p + 1;
}
}

/* flush */
if (p_start != p)
fwrite(p_start, p - p_start, 1, stdout);
}

int cmd_name_rev(int argc, const char **argv, const char *prefix)
{
struct object_array revs = { 0, 0, NULL };
Expand Down Expand Up @@ -234,47 +273,12 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)

if (transform_stdin) {
char buffer[2048];
char *p, *p_start;

while (!feof(stdin)) {
int forty = 0;
p = fgets(buffer, sizeof(buffer), stdin);
char *p = fgets(buffer, sizeof(buffer), stdin);
if (!p)
break;

for (p_start = p; *p; p++) {
#define ishex(x) (isdigit((x)) || ((x) >= 'a' && (x) <= 'f'))
if (!ishex(*p))
forty = 0;
else if (++forty == 40 &&
!ishex(*(p+1))) {
unsigned char sha1[40];
const char *name = NULL;
char c = *(p+1);

forty = 0;

*(p+1) = 0;
if (!get_sha1(p - 39, sha1)) {
struct object *o =
lookup_object(sha1);
if (o)
name = get_rev_name(o);
}
*(p+1) = c;

if (!name)
continue;

fwrite(p_start, p - p_start + 1, 1, stdout);
printf(" (%s)", name);
p_start = p + 1;
}
}

/* flush */
if (p_start != p)
fwrite(p_start, p - p_start, 1, stdout);
name_rev_line(p, &data);
}
} else if (all) {
int i, max;
Expand Down

0 comments on commit e8b55fa

Please sign in to comment.