threads / patch / 43483

patch, 3 partsRe: [PATCH 3/3] Remove unsupported C99 style struct initializers in git-archive.

Subject: Re: [PATCH 3/3] Remove unsupported C99 style struct initializers in git-archive.

## tl;dr

3 messages between Nov 5, 2006 and Nov 5, 2006. Diffs are folded; open one to read it.

replies: 2people: 2as markdown or json

Shawn O. Pearce· Nov 5, 2006, 05:37 UTC · lore

[PATCH 3/3] Remove unsupported C99 style struct initializers in git-archive.

At least one older version of the Solaris C compiler doesn't support the newer C99 style struct initializers. To allow Git to compile on those systems use an archive description struct which is easier to initialize without the C99 struct initializer syntax.

Also since the archives array is not used by anyone other than archive.c we can make it static.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 archive.h         |    2 --
 builtin-archive.c |   23 ++++++++++++-----------
 2 files changed, 12 insertions(+), 13 deletions(-)
Show changes to 2 files +12 −13

archive.h, builtin-archive.c

diff --git a/archive.h b/archive.h
index 16dcdb8..6838dc7 100644
--- a/archive.h
+++ b/archive.h
@@ -25,8 +25,6 @@ struct archiver {
 	parse_extra_args_fn_t parse_extra;
 };
 
-extern struct archiver archivers[];
-
 extern int parse_archive_args(int argc,
 			      const char **argv,
 			      struct archiver *ar);
diff --git a/builtin-archive.c b/builtin-archive.c
index 9177379..2df1a84 100644
--- a/builtin-archive.c
+++ b/builtin-archive.c
@@ -15,16 +15,14 @@
 static const char archive_usage[] = \
 "git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]";
 
-struct archiver archivers[] = {
-	{
-		.name		= "tar",
-		.write_archive	= write_tar_archive,
-	},
-	{
-		.name		= "zip",
-		.write_archive	= write_zip_archive,
-		.parse_extra	= parse_extra_zip_args,
-	},
+static struct archiver_desc
+{
+	const char *name;
+	write_archive_fn_t write_archive;
+	parse_extra_args_fn_t parse_extra;
+} archivers[] = {
+	{ "tar", write_tar_archive, NULL },
+	{ "zip", write_zip_archive, parse_extra_zip_args },
 };
 
 static int run_remote_archiver(const char *remote, int argc,
@@ -88,7 +86,10 @@ static int init_archiver(const char *nam
 
 	for (i = 0; i < ARRAY_SIZE(archivers); i++) {
 		if (!strcmp(name, archivers[i].name)) {
-			memcpy(ar, &archivers[i], sizeof(struct archiver));
+			memset(ar, 0, sizeof(*ar));
+			ar->name = archivers[i].name;
+			ar->write_archive = archivers[i].write_archive;
+			ar->parse_extra = archivers[i].parse_extra;
 			rv = 0;
 			break;
 		}
Junio C Hamano· Nov 5, 2006, 07:32 UTC · re: Shawn O. Pearce · lore
"Shawn O. Pearce" <spearce@spearce.org> writes:
Show 9 quoted lines
> +static struct archiver_desc
> +{
> +	const char *name;
> +	write_archive_fn_t write_archive;
> +	parse_extra_args_fn_t parse_extra;
> +} archivers[] = {
> +	{ "tar", write_tar_archive, NULL },
> +	{ "zip", write_zip_archive, parse_extra_zip_args },
>  };

If this were a struct with bazillions of fields I might have had trouble swallowing the change, but this is so small that it is no brainer.

I think this actually is an improvement.
Show 10 quoted lines
>  static int run_remote_archiver(const char *remote, int argc,
> @@ -88,7 +86,10 @@ static int init_archiver(const char *nam
>  
>  	for (i = 0; i < ARRAY_SIZE(archivers); i++) {
>  		if (!strcmp(name, archivers[i].name)) {
> -			memcpy(ar, &archivers[i], sizeof(struct archiver));
> +			memset(ar, 0, sizeof(*ar));
> +			ar->name = archivers[i].name;
> +			ar->write_archive = archivers[i].write_archive;
> +			ar->parse_extra = archivers[i].parse_extra;

But is this change really needed? Shouldn't a structure assignment just work?

Shawn Pearce· Nov 5, 2006, 07:36 UTC · re: Junio C Hamano · lore
Junio C Hamano <junkio@cox.net> wrote:
Show 15 quoted lines
> "Shawn O. Pearce" <spearce@spearce.org> writes:
> 
> > +static struct archiver_desc
> > +{
> > +	const char *name;
> > +	write_archive_fn_t write_archive;
> > +	parse_extra_args_fn_t parse_extra;
> > +} archivers[] = {
> > +	{ "tar", write_tar_archive, NULL },
> > +	{ "zip", write_zip_archive, parse_extra_zip_args },
> >  };
> 
> If this were a struct with bazillions of fields I might have had
> trouble swallowing the change, but this is so small that it is
> no brainer.
Right; if it was larger I would have been in trouble.  :-)
Show 15 quoted lines
> I think this actually is an improvement.
> 
> >  static int run_remote_archiver(const char *remote, int argc,
> > @@ -88,7 +86,10 @@ static int init_archiver(const char *nam
> >  
> >  	for (i = 0; i < ARRAY_SIZE(archivers); i++) {
> >  		if (!strcmp(name, archivers[i].name)) {
> > -			memcpy(ar, &archivers[i], sizeof(struct archiver));
> > +			memset(ar, 0, sizeof(*ar));
> > +			ar->name = archivers[i].name;
> > +			ar->write_archive = archivers[i].write_archive;
> > +			ar->parse_extra = archivers[i].parse_extra;
> 
> But is this change really needed?  Shouldn't a structure
> assignment just work?
No, they are different structs...

Which I did to reduce the size of the initializer (see above) so that it was a no brainer for you to swallow. :-)

← back to recent threads