{"thread":{"id":"14454","subject":"[PATCH 1/6] archive: remove args member from struct archiver","startedAt":"2008-07-14T19:23:45Z","lastAt":"2008-07-15T12:29:18Z","messageCount":3,"participants":["René Scharfe","Karl Hasselström"],"isPatch":true,"patchVersion":1,"patchTotal":6},"messages":[{"id":"83295","messageId":"487BA7C1.3000109@lsrfire.ath.cx","threadId":"14454","inReplyTo":"487B8E81.5030402@lsrfire.ath.cx","subject":"[PATCH 1/6] archive: remove args member from struct archiver","fromName":"René Scharfe","fromEmail":"rene.scharfe@lsrfire.ath.cx","sentAt":"2008-07-14T19:23:45Z","receivedAt":"2008-07-14T19:23:45Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Pass struct archiver and struct archiver_args explicitly to\nparse_archive_args\nand remove the latter from the former.  This allows us to get rid of struct\narchiver_desc and simplifies the code a bit.\n\nSigned-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>\n---\n archive.h                |    5 +---\n builtin-archive.c        |   51\n+++++++++++++++++++---------------------------\n builtin-upload-archive.c |   11 +++++----\n 3 files changed, 28 insertions(+), 39 deletions(-)\n\ndiff --git a/archive.h b/archive.h\nindex ddf004a..1b24ae3 100644\n--- a/archive.h\n+++ b/archive.h\n@@ -21,14 +21,11 @@ typedef void *(*parse_extra_args_fn_t)(int argc,\nconst char **argv);\n\n struct archiver {\n \tconst char *name;\n-\tstruct archiver_args args;\n \twrite_archive_fn_t write_archive;\n \tparse_extra_args_fn_t parse_extra;\n };\n\n-extern int parse_archive_args(int argc,\n-\t\t\t      const char **argv,\n-\t\t\t      struct archiver *ar);\n+extern int parse_archive_args(int argc, const char **argv, const struct\narchiver **ar, struct archiver_args *args);\n\n extern void parse_treeish_arg(const char **treeish,\n \t\t\t      struct archiver_args *ar_args,\ndiff --git a/builtin-archive.c b/builtin-archive.c\nindex c2e0c1e..6ee3677 100644\n--- a/builtin-archive.c\n+++ b/builtin-archive.c\n@@ -15,12 +15,7 @@\n static const char archive_usage[] = \\\n \"git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>]\n<tree-ish> [path...]\";\n\n-static struct archiver_desc\n-{\n-\tconst char *name;\n-\twrite_archive_fn_t write_archive;\n-\tparse_extra_args_fn_t parse_extra;\n-} archivers[] = {\n+const struct archiver archivers[] = {\n \t{ \"tar\", write_tar_archive, NULL },\n \t{ \"zip\", write_zip_archive, parse_extra_zip_args },\n };\n@@ -79,21 +74,15 @@ static int run_remote_archiver(const char *remote,\nint argc,\n \treturn !!rv;\n }\n\n-static int init_archiver(const char *name, struct archiver *ar)\n+static const struct archiver *lookup_archiver(const char *name)\n {\n-\tint rv = -1, i;\n+\tint i;\n\n \tfor (i = 0; i < ARRAY_SIZE(archivers); i++) {\n-\t\tif (!strcmp(name, archivers[i].name)) {\n-\t\t\tmemset(ar, 0, sizeof(*ar));\n-\t\t\tar->name = archivers[i].name;\n-\t\t\tar->write_archive = archivers[i].write_archive;\n-\t\t\tar->parse_extra = archivers[i].parse_extra;\n-\t\t\trv = 0;\n-\t\t\tbreak;\n-\t\t}\n+\t\tif (!strcmp(name, archivers[i].name))\n+\t\t\treturn &archivers[i];\n \t}\n-\treturn rv;\n+\treturn NULL;\n }\n\n void parse_pathspec_arg(const char **pathspec, struct archiver_args\n*ar_args)\n@@ -145,7 +134,8 @@ void parse_treeish_arg(const char **argv, struct\narchiver_args *ar_args,\n \tar_args->time = archive_time;\n }\n\n-int parse_archive_args(int argc, const char **argv, struct archiver *ar)\n+int parse_archive_args(int argc, const char **argv, const struct\narchiver **ar,\n+\t\tstruct archiver_args *args)\n {\n \tconst char *extra_argv[MAX_EXTRA_ARGS];\n \tint extra_argc = 0;\n@@ -190,17 +180,18 @@ int parse_archive_args(int argc, const char\n**argv, struct archiver *ar)\n \t/* We need at least one parameter -- tree-ish */\n \tif (argc - 1 < i)\n \t\tusage(archive_usage);\n-\tif (init_archiver(format, ar) < 0)\n+\t*ar = lookup_archiver(format);\n+\tif (!*ar)\n \t\tdie(\"Unknown archive format '%s'\", format);\n\n \tif (extra_argc) {\n-\t\tif (!ar->parse_extra)\n+\t\tif (!(*ar)->parse_extra)\n \t\t\tdie(\"'%s' format does not handle %s\",\n-\t\t\t    ar->name, extra_argv[0]);\n-\t\tar->args.extra = ar->parse_extra(extra_argc, extra_argv);\n+\t\t\t    (*ar)->name, extra_argv[0]);\n+\t\targs->extra = (*ar)->parse_extra(extra_argc, extra_argv);\n \t}\n-\tar->args.verbose = verbose;\n-\tar->args.base = base;\n+\targs->verbose = verbose;\n+\targs->base = base;\n\n \treturn i;\n }\n@@ -238,7 +229,8 @@ static const char *extract_remote_arg(int *ac, const\nchar **av)\n\n int cmd_archive(int argc, const char **argv, const char *prefix)\n {\n-\tstruct archiver ar;\n+\tconst struct archiver *ar = NULL;\n+\tstruct archiver_args args;\n \tint tree_idx;\n \tconst char *remote = NULL;\n\n@@ -248,14 +240,13 @@ int cmd_archive(int argc, const char **argv, const\nchar *prefix)\n\n \tsetvbuf(stderr, NULL, _IOLBF, BUFSIZ);\n\n-\tmemset(&ar, 0, sizeof(ar));\n-\ttree_idx = parse_archive_args(argc, argv, &ar);\n+\ttree_idx = parse_archive_args(argc, argv, &ar, &args);\n \tif (prefix == NULL)\n \t\tprefix = setup_git_directory();\n\n \targv += tree_idx;\n-\tparse_treeish_arg(argv, &ar.args, prefix);\n-\tparse_pathspec_arg(argv + 1, &ar.args);\n+\tparse_treeish_arg(argv, &args, prefix);\n+\tparse_pathspec_arg(argv + 1, &args);\n\n-\treturn ar.write_archive(&ar.args);\n+\treturn ar->write_archive(&args);\n }\ndiff --git a/builtin-upload-archive.c b/builtin-upload-archive.c\nindex 371400d..295e24c 100644\n--- a/builtin-upload-archive.c\n+++ b/builtin-upload-archive.c\n@@ -19,7 +19,8 @@ static const char lostchild[] =\n\n static int run_upload_archive(int argc, const char **argv, const char\n*prefix)\n {\n-\tstruct archiver ar;\n+\tconst struct archiver *ar;\n+\tstruct archiver_args args;\n \tconst char *sent_argv[MAX_ARGS];\n \tconst char *arg_cmd = \"argument \";\n \tchar *p, buf[4096];\n@@ -65,12 +66,12 @@ static int run_upload_archive(int argc, const char\n**argv, const char *prefix)\n \tsent_argv[sent_argc] = NULL;\n\n \t/* parse all options sent by the client */\n-\ttreeish_idx = parse_archive_args(sent_argc, sent_argv, &ar);\n+\ttreeish_idx = parse_archive_args(sent_argc, sent_argv, &ar, &args);\n\n-\tparse_treeish_arg(sent_argv + treeish_idx, &ar.args, prefix);\n-\tparse_pathspec_arg(sent_argv + treeish_idx + 1, &ar.args);\n+\tparse_treeish_arg(sent_argv + treeish_idx, &args, prefix);\n+\tparse_pathspec_arg(sent_argv + treeish_idx + 1, &args);\n\n-\treturn ar.write_archive(&ar.args);\n+\treturn ar->write_archive(&args);\n }\n\n static void error_clnt(const char *fmt, ...)\n-- \n1.5.6.2.212.g08b51\n"},{"id":"83370","messageId":"487C5694.7050607@lsrfire.ath.cx","threadId":"14454","inReplyTo":"487BA7C1.3000109@lsrfire.ath.cx","subject":"Re: [PATCH 1/6] archive: remove args member from struct archiver","fromName":"René Scharfe","fromEmail":"rene.scharfe@lsrfire.ath.cx","sentAt":"2008-07-15T07:49:40Z","receivedAt":"2008-07-15T07:49:40Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"[Resent with fixed line wrap.]\nPass struct archiver and struct archiver_args explicitly to parse_archive_args\nand remove the latter from the former.  This allows us to get rid of struct\narchiver_desc and simplifies the code a bit.\n\nSigned-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>\n---\n archive.h                |    5 +---\n builtin-archive.c        |   51 +++++++++++++++++++---------------------------\n builtin-upload-archive.c |   11 +++++----\n 3 files changed, 28 insertions(+), 39 deletions(-)\n\ndiff --git a/archive.h b/archive.h\nindex ddf004a..1b24ae3 100644\n--- a/archive.h\n+++ b/archive.h\n@@ -21,14 +21,11 @@ typedef void *(*parse_extra_args_fn_t)(int argc, const char **argv);\n \n struct archiver {\n \tconst char *name;\n-\tstruct archiver_args args;\n \twrite_archive_fn_t write_archive;\n \tparse_extra_args_fn_t parse_extra;\n };\n \n-extern int parse_archive_args(int argc,\n-\t\t\t      const char **argv,\n-\t\t\t      struct archiver *ar);\n+extern int parse_archive_args(int argc, const char **argv, const struct archiver **ar, struct archiver_args *args);\n \n extern void parse_treeish_arg(const char **treeish,\n \t\t\t      struct archiver_args *ar_args,\ndiff --git a/builtin-archive.c b/builtin-archive.c\nindex c2e0c1e..6ee3677 100644\n--- a/builtin-archive.c\n+++ b/builtin-archive.c\n@@ -15,12 +15,7 @@\n static const char archive_usage[] = \\\n \"git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]\";\n \n-static struct archiver_desc\n-{\n-\tconst char *name;\n-\twrite_archive_fn_t write_archive;\n-\tparse_extra_args_fn_t parse_extra;\n-} archivers[] = {\n+const struct archiver archivers[] = {\n \t{ \"tar\", write_tar_archive, NULL },\n \t{ \"zip\", write_zip_archive, parse_extra_zip_args },\n };\n@@ -79,21 +74,15 @@ static int run_remote_archiver(const char *remote, int argc,\n \treturn !!rv;\n }\n \n-static int init_archiver(const char *name, struct archiver *ar)\n+static const struct archiver *lookup_archiver(const char *name)\n {\n-\tint rv = -1, i;\n+\tint i;\n \n \tfor (i = 0; i < ARRAY_SIZE(archivers); i++) {\n-\t\tif (!strcmp(name, archivers[i].name)) {\n-\t\t\tmemset(ar, 0, sizeof(*ar));\n-\t\t\tar->name = archivers[i].name;\n-\t\t\tar->write_archive = archivers[i].write_archive;\n-\t\t\tar->parse_extra = archivers[i].parse_extra;\n-\t\t\trv = 0;\n-\t\t\tbreak;\n-\t\t}\n+\t\tif (!strcmp(name, archivers[i].name))\n+\t\t\treturn &archivers[i];\n \t}\n-\treturn rv;\n+\treturn NULL;\n }\n \n void parse_pathspec_arg(const char **pathspec, struct archiver_args *ar_args)\n@@ -145,7 +134,8 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,\n \tar_args->time = archive_time;\n }\n \n-int parse_archive_args(int argc, const char **argv, struct archiver *ar)\n+int parse_archive_args(int argc, const char **argv, const struct archiver **ar,\n+\t\tstruct archiver_args *args)\n {\n \tconst char *extra_argv[MAX_EXTRA_ARGS];\n \tint extra_argc = 0;\n@@ -190,17 +180,18 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)\n \t/* We need at least one parameter -- tree-ish */\n \tif (argc - 1 < i)\n \t\tusage(archive_usage);\n-\tif (init_archiver(format, ar) < 0)\n+\t*ar = lookup_archiver(format);\n+\tif (!*ar)\n \t\tdie(\"Unknown archive format '%s'\", format);\n \n \tif (extra_argc) {\n-\t\tif (!ar->parse_extra)\n+\t\tif (!(*ar)->parse_extra)\n \t\t\tdie(\"'%s' format does not handle %s\",\n-\t\t\t    ar->name, extra_argv[0]);\n-\t\tar->args.extra = ar->parse_extra(extra_argc, extra_argv);\n+\t\t\t    (*ar)->name, extra_argv[0]);\n+\t\targs->extra = (*ar)->parse_extra(extra_argc, extra_argv);\n \t}\n-\tar->args.verbose = verbose;\n-\tar->args.base = base;\n+\targs->verbose = verbose;\n+\targs->base = base;\n \n \treturn i;\n }\n@@ -238,7 +229,8 @@ static const char *extract_remote_arg(int *ac, const char **av)\n \n int cmd_archive(int argc, const char **argv, const char *prefix)\n {\n-\tstruct archiver ar;\n+\tconst struct archiver *ar = NULL;\n+\tstruct archiver_args args;\n \tint tree_idx;\n \tconst char *remote = NULL;\n \n@@ -248,14 +240,13 @@ int cmd_archive(int argc, const char **argv, const char *prefix)\n \n \tsetvbuf(stderr, NULL, _IOLBF, BUFSIZ);\n \n-\tmemset(&ar, 0, sizeof(ar));\n-\ttree_idx = parse_archive_args(argc, argv, &ar);\n+\ttree_idx = parse_archive_args(argc, argv, &ar, &args);\n \tif (prefix == NULL)\n \t\tprefix = setup_git_directory();\n \n \targv += tree_idx;\n-\tparse_treeish_arg(argv, &ar.args, prefix);\n-\tparse_pathspec_arg(argv + 1, &ar.args);\n+\tparse_treeish_arg(argv, &args, prefix);\n+\tparse_pathspec_arg(argv + 1, &args);\n \n-\treturn ar.write_archive(&ar.args);\n+\treturn ar->write_archive(&args);\n }\ndiff --git a/builtin-upload-archive.c b/builtin-upload-archive.c\nindex 371400d..295e24c 100644\n--- a/builtin-upload-archive.c\n+++ b/builtin-upload-archive.c\n@@ -19,7 +19,8 @@ static const char lostchild[] =\n \n static int run_upload_archive(int argc, const char **argv, const char *prefix)\n {\n-\tstruct archiver ar;\n+\tconst struct archiver *ar;\n+\tstruct archiver_args args;\n \tconst char *sent_argv[MAX_ARGS];\n \tconst char *arg_cmd = \"argument \";\n \tchar *p, buf[4096];\n@@ -65,12 +66,12 @@ static int run_upload_archive(int argc, const char **argv, const char *prefix)\n \tsent_argv[sent_argc] = NULL;\n \n \t/* parse all options sent by the client */\n-\ttreeish_idx = parse_archive_args(sent_argc, sent_argv, &ar);\n+\ttreeish_idx = parse_archive_args(sent_argc, sent_argv, &ar, &args);\n \n-\tparse_treeish_arg(sent_argv + treeish_idx, &ar.args, prefix);\n-\tparse_pathspec_arg(sent_argv + treeish_idx + 1, &ar.args);\n+\tparse_treeish_arg(sent_argv + treeish_idx, &args, prefix);\n+\tparse_pathspec_arg(sent_argv + treeish_idx + 1, &args);\n \n-\treturn ar.write_archive(&ar.args);\n+\treturn ar->write_archive(&args);\n }\n \n static void error_clnt(const char *fmt, ...)\n-- \n1.5.6.2.212.g08b51\n"},{"id":"83388","messageId":"20080715122918.GA17008@diana.vm.bytemark.co.uk","threadId":"14454","inReplyTo":"487C5694.7050607@lsrfire.ath.cx","subject":"Re: [PATCH 1/6] archive: remove args member from struct archiver","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2008-07-15T12:29:18Z","receivedAt":"2008-07-15T12:29:18Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2008-07-15 09:49:40 +0200, René Scharfe wrote:\n\n> [Resent with fixed line wrap.]\n\nAnd this remark embedded in the commit message. :-P\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"}]}