builtin-name-rev.c: split deeply nested part from the main function
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>
This commit is contained in:
parent
e124554796
commit
e8b55fab62
@ -176,6 +176,45 @@ static char const * const name_rev_usage[] = {
|
|||||||
NULL
|
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)
|
int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct object_array revs = { 0, 0, NULL };
|
struct object_array revs = { 0, 0, NULL };
|
||||||
@ -234,47 +273,12 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
if (transform_stdin) {
|
if (transform_stdin) {
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
char *p, *p_start;
|
|
||||||
|
|
||||||
while (!feof(stdin)) {
|
while (!feof(stdin)) {
|
||||||
int forty = 0;
|
char *p = fgets(buffer, sizeof(buffer), stdin);
|
||||||
p = fgets(buffer, sizeof(buffer), stdin);
|
|
||||||
if (!p)
|
if (!p)
|
||||||
break;
|
break;
|
||||||
|
name_rev_line(p, &data);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
} else if (all) {
|
} else if (all) {
|
||||||
int i, max;
|
int i, max;
|
||||||
|
Loading…
Reference in New Issue
Block a user