grep: typesafe versions of grep_source_init

grep_source_init() can create "struct grep_source" objects and,
depending on the value of the type passed, some void-pointer parameters have
different meanings. Because one of these types (GREP_SOURCE_OID) will
require an additional parameter in a subsequent patch, take the
opportunity to increase clarity and type safety by replacing this
function with individual functions for each type.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Reviewed-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Tan
2021-08-16 14:09:53 -07:00
committed by Junio C Hamano
parent 8d33c3af0b
commit 50d92b5f03
3 changed files with 34 additions and 23 deletions

46
grep.c
View File

@ -1825,14 +1825,24 @@ int grep_source(struct grep_opt *opt, struct grep_source *gs)
return grep_source_1(opt, gs, 0);
}
static void grep_source_init_buf(struct grep_source *gs, char *buf,
unsigned long size)
{
gs->type = GREP_SOURCE_BUF;
gs->name = NULL;
gs->path = NULL;
gs->buf = buf;
gs->size = size;
gs->driver = NULL;
gs->identifier = NULL;
}
int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size)
{
struct grep_source gs;
int r;
grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL, NULL);
gs.buf = buf;
gs.size = size;
grep_source_init_buf(&gs, buf, size);
r = grep_source(opt, &gs);
@ -1840,28 +1850,28 @@ int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size)
return r;
}
void grep_source_init(struct grep_source *gs, enum grep_source_type type,
const char *name, const char *path,
const void *identifier)
void grep_source_init_file(struct grep_source *gs, const char *name,
const char *path)
{
gs->type = type;
gs->type = GREP_SOURCE_FILE;
gs->name = xstrdup_or_null(name);
gs->path = xstrdup_or_null(path);
gs->buf = NULL;
gs->size = 0;
gs->driver = NULL;
gs->identifier = xstrdup(path);
}
switch (type) {
case GREP_SOURCE_FILE:
gs->identifier = xstrdup(identifier);
break;
case GREP_SOURCE_OID:
gs->identifier = oiddup(identifier);
break;
case GREP_SOURCE_BUF:
gs->identifier = NULL;
break;
}
void grep_source_init_oid(struct grep_source *gs, const char *name,
const char *path, const struct object_id *oid)
{
gs->type = GREP_SOURCE_OID;
gs->name = xstrdup_or_null(name);
gs->path = xstrdup_or_null(path);
gs->buf = NULL;
gs->size = 0;
gs->driver = NULL;
gs->identifier = oiddup(oid);
}
void grep_source_clear(struct grep_source *gs)