diff mbox series

[3/7] grep: typesafe versions of grep_source_init

Message ID e5e6a0dc1ef59b2ab419816e463814d93115e7f6.1628618950.git.jonathantanmy@google.com (mailing list archive)
State Superseded
Headers show
Series In grep, no adding submodule ODB as alternates | expand

Commit Message

Jonathan Tan Aug. 10, 2021, 6:28 p.m. UTC
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>
---
 builtin/grep.c |  4 ++--
 grep.c         | 43 +++++++++++++++++++++++++++----------------
 grep.h         |  8 +++++---
 3 files changed, 34 insertions(+), 21 deletions(-)

Comments

Junio C Hamano Aug. 10, 2021, 9:38 p.m. UTC | #1
Jonathan Tan <jonathantanmy@google.com> writes:

> 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.

Nice clean-up.
Emily Shaffer Aug. 11, 2021, 9:42 p.m. UTC | #2
On Tue, Aug 10, 2021 at 11:28:41AM -0700, Jonathan Tan wrote:
> 
> 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>
Like Junio said, it is very neat.

Reviewed-by: Emily Shaffer <emilyshaffer@google.com>
Matheus Tavares Aug. 11, 2021, 10:45 p.m. UTC | #3
On Tue, Aug 10, 2021 at 3:29 PM Jonathan Tan <jonathantanmy@google.com> wrote:
>
> diff --git a/grep.c b/grep.c
> index 424a39591b..ba3711dc56 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -1830,7 +1830,7 @@ 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);
> +       grep_source_init_buf(&gs);
>         gs.buf = buf;
>         gs.size = size;

Small nit: perhaps `grep_source_init_buf()` could take `buf` and
`size` too, so that all the fields get initialized by the same
function.
Ramsay Jones Aug. 11, 2021, 11:07 p.m. UTC | #4
On Wed, Aug 11, 2021 at 02:42:20PM -0700, Emily Shaffer wrote:
> On Tue, Aug 10, 2021 at 11:28:41AM -0700, Jonathan Tan wrote:
> > 
> > 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>
> Like Junio said, it is very neat.

[Sorry for piggy-backing, I have already deleted the original mail :( ]

Just a quick note: grep_source_init_buf() is only called from
grep.c:1833, before its definition at grep.c:1869, so it could be marked
as static (as things stand). Do you anticipate any future callers from
outside of grep.c? (after removing the declaration from grep.h, you
would need to add a forward declaration or, better, move the definition
to before the call (or the call (and grep_buffer()) after the definition)).

ATB,
Ramsay Jones
Junio C Hamano Aug. 12, 2021, 4:49 p.m. UTC | #5
Matheus Tavares Bernardino <matheus.bernardino@usp.br> writes:

> On Tue, Aug 10, 2021 at 3:29 PM Jonathan Tan <jonathantanmy@google.com> wrote:
>>
>> diff --git a/grep.c b/grep.c
>> index 424a39591b..ba3711dc56 100644
>> --- a/grep.c
>> +++ b/grep.c
>> @@ -1830,7 +1830,7 @@ 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);
>> +       grep_source_init_buf(&gs);
>>         gs.buf = buf;
>>         gs.size = size;
>
> Small nit: perhaps `grep_source_init_buf()` could take `buf` and
> `size` too, so that all the fields get initialized by the same
> function.

Sounds sensible.  Thanks.
Jonathan Tan Aug. 13, 2021, 4:32 p.m. UTC | #6
> Just a quick note: grep_source_init_buf() is only called from
> grep.c:1833, before its definition at grep.c:1869, so it could be marked
> as static (as things stand). Do you anticipate any future callers from
> outside of grep.c? (after removing the declaration from grep.h, you
> would need to add a forward declaration or, better, move the definition
> to before the call (or the call (and grep_buffer()) after the definition)).

No, I do not - thanks for the note, and I'll make it static in the next
reroll.
Jonathan Tan Aug. 13, 2021, 4:33 p.m. UTC | #7
> > Small nit: perhaps `grep_source_init_buf()` could take `buf` and
> > `size` too, so that all the fields get initialized by the same
> > function.
> 
> Sounds sensible.  Thanks.

Makes sense - I'll do this.
diff mbox series

Patch

diff --git a/builtin/grep.c b/builtin/grep.c
index 87bcb934a2..e454335e9d 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -333,7 +333,7 @@  static int grep_oid(struct grep_opt *opt, const struct object_id *oid,
 	struct grep_source gs;
 
 	grep_source_name(opt, filename, tree_name_len, &pathbuf);
-	grep_source_init(&gs, GREP_SOURCE_OID, pathbuf.buf, path, oid);
+	grep_source_init_oid(&gs, pathbuf.buf, path, oid);
 	strbuf_release(&pathbuf);
 
 	if (num_threads > 1) {
@@ -359,7 +359,7 @@  static int grep_file(struct grep_opt *opt, const char *filename)
 	struct grep_source gs;
 
 	grep_source_name(opt, filename, 0, &buf);
-	grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename, filename);
+	grep_source_init_file(&gs, buf.buf, filename);
 	strbuf_release(&buf);
 
 	if (num_threads > 1) {
diff --git a/grep.c b/grep.c
index 424a39591b..ba3711dc56 100644
--- a/grep.c
+++ b/grep.c
@@ -1830,7 +1830,7 @@  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);
+	grep_source_init_buf(&gs);
 	gs.buf = buf;
 	gs.size = size;
 
@@ -1840,28 +1840,39 @@  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_init_buf(struct grep_source *gs)
+{
+	gs->type = GREP_SOURCE_BUF;
+	gs->name = NULL;
+	gs->path = NULL;
+	gs->buf = NULL;
+	gs->size = 0;
+	gs->driver = NULL;
+	gs->identifier = NULL;
 }
 
 void grep_source_clear(struct grep_source *gs)
diff --git a/grep.h b/grep.h
index 72f82b1e30..f4a3090f1c 100644
--- a/grep.h
+++ b/grep.h
@@ -195,9 +195,11 @@  struct grep_source {
 	struct userdiff_driver *driver;
 };
 
-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);
+void grep_source_init_oid(struct grep_source *gs, const char *name,
+			  const char *path, const struct object_id *oid);
+void grep_source_init_buf(struct grep_source *gs);
 void grep_source_clear_data(struct grep_source *gs);
 void grep_source_clear(struct grep_source *gs);
 void grep_source_load_driver(struct grep_source *gs,