{"thread":{"id":"24631","subject":"[RFC] struct *_struct","startedAt":"2010-08-04T15:08:43Z","lastAt":"2010-08-06T12:29:20Z","messageCount":8,"participants":["Jared Hance","Junio C Hamano","Michael Witten","Miles Bader"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"147115","messageId":"20100804150843.GA2762@localhost.localdomain","threadId":"24631","inReplyTo":null,"subject":"[RFC] struct *_struct","fromName":"Jared Hance","fromEmail":"jaredhance@gmail.com","sentAt":"2010-08-04T15:08:43Z","receivedAt":"2010-08-04T15:08:43Z","isPatch":false,"sender":{"key":"jaredhance@gmail.com","avatar":"https://avatars.githubusercontent.com/u/170192?v=4"},"body":"After browsing some of the diff related code today, I noted the\nstructure \"struct diff_queue_struct\". I found it somewhat odd that a\nstruct had struct in the name of the struct, and I hadn't really seen\nany others like this.\n\nIndeed, there are two others: struct dir_struct and struct cmd_struct.\n\nTo see, you can run:\n\n    $ git grep _struct *.c *.h\n\n\nTyping \"struct *_struct\" is rather verbose - We already have to\nprepend the \"struct\", so it is extremely clear that we are using a\nstruct. Is there a reason that:\n\n    - We are extremely verbose\n    - We use this style in only 3 cases\n"},{"id":"147129","messageId":"7vaap2fafm.fsf@alter.siamese.dyndns.org","threadId":"24631","inReplyTo":"20100804150843.GA2762@localhost.localdomain","subject":"Re: [RFC] struct *_struct","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-08-04T19:24:29Z","receivedAt":"2010-08-04T19:24:29Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jared Hance <jaredhance@gmail.com> writes:\n\n>     - We use this style in only 3 cases\n\nI think they were early-days inertia between me and Linus.  I hate \"struct\nfoo_struct\" (and \"typedef foo struct foo\") myself and that is why we don't\nsee many others.\n\nI am personally Ok if you want to give them more sensible names.  Doing\ns/_struct$// is a no-brainer for \"diff_queue_struct\", but I do not think\ndoing that alone would be a good idea for \"cmd_struct\" and \"dir_struct\".\n\nI'd suggest calling the former \"cmd_desc\", as it is a set of info on a\nsingle command.  \"dir_struct\" is a table that records a set of paths in\nthe whole work tree and it is not about a single directory (nor a single\nentry in that table, which is \"dir_entry\"); as such \"dir\" that sounds too\nsimilar to DIR that is what opendir() returns (i.e. a single directory)\nmay probably not be a good name for it.\n"},{"id":"147136","messageId":"c34445d9822bd9fd120902e80ed3637eacc818e3.1280956717.git.jaredhance@gmail.com","threadId":"24631","inReplyTo":"7vaap2fafm.fsf@alter.siamese.dyndns.org","subject":"[PATCH] Refactor structures in the form of *_struct.","fromName":"Jared Hance","fromEmail":"jaredhance@gmail.com","sentAt":"2010-08-04T21:38:12Z","receivedAt":"2010-08-04T21:38:12Z","isPatch":true,"sender":{"key":"jaredhance@gmail.com","avatar":"https://avatars.githubusercontent.com/u/170192?v=4"},"body":"Having a structure suffixed with _struct is extremely verbose,\nespecially since using the structure requires prefixing with the keyword\nstruct. Rename the following structures:\n\ndiff_queue_struct => diff_queue\ndir_struct        => dir_table\ncmd_struct        => cmd_desc\n\nSigned-off-by: Jared Hance <jaredhance@gmail.com>\n---\n\nHopefully dir_table is a good name for dir_struct - I haven't done\nmuch with that area of the code.\n\n builtin/add.c         |    8 ++++----\n builtin/clean.c       |    2 +-\n builtin/fast-export.c |    2 +-\n builtin/grep.c        |    2 +-\n builtin/ls-files.c    |   12 ++++++------\n builtin/merge.c       |    4 ++--\n builtin/read-tree.c   |    2 +-\n builtin/reset.c       |    2 +-\n combine-diff.c        |    2 +-\n diff.c                |   32 ++++++++++++++++----------------\n diff.h                |    4 ++--\n diffcore-break.c      |   10 +++++-----\n diffcore-order.c      |    2 +-\n diffcore-pickaxe.c    |    4 ++--\n diffcore-rename.c     |    4 ++--\n diffcore.h            |   10 +++++-----\n dir.c                 |   28 ++++++++++++++--------------\n dir.h                 |   14 +++++++-------\n git.c                 |    8 ++++----\n tree-diff.c           |    2 +-\n unpack-trees.c        |    2 +-\n unpack-trees.h        |    2 +-\n wt-status.c           |    6 +++---\n 23 files changed, 82 insertions(+), 82 deletions(-)\n\ndiff --git a/builtin/add.c b/builtin/add.c\nindex 56a4e0a..40772dc 100644\n--- a/builtin/add.c\n+++ b/builtin/add.c\n@@ -27,7 +27,7 @@ struct update_callback_data\n \tint add_errors;\n };\n \n-static void update_callback(struct diff_queue_struct *q,\n+static void update_callback(struct diff_queue *q,\n \t\t\t    struct diff_options *opt, void *cbdata)\n {\n \tint i;\n@@ -129,7 +129,7 @@ static char *find_used_pathspec(const char **pathspec)\n \treturn seen;\n }\n \n-static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)\n+static char *prune_directory(struct dir_table *dir, const char **pathspec, int prefix)\n {\n \tchar *seen;\n \tint i, specs;\n@@ -338,7 +338,7 @@ static int add_config(const char *var, const char *value, void *cb)\n \treturn git_default_config(var, value, cb);\n }\n \n-static int add_files(struct dir_struct *dir, int flags)\n+static int add_files(struct dir_table *dir, int flags)\n {\n \tint i, exit_status = 0;\n \n@@ -364,7 +364,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)\n \tint exit_status = 0;\n \tint newfd;\n \tconst char **pathspec;\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \tint flags;\n \tint add_new_files;\n \tint require_pathspec;\ndiff --git a/builtin/clean.c b/builtin/clean.c\nindex fac64e6..e632ff5 100644\n--- a/builtin/clean.c\n+++ b/builtin/clean.c\n@@ -33,7 +33,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)\n \tint ignored_only = 0, baselen = 0, config_set = 0, errors = 0;\n \tint rm_flags = REMOVE_DIR_KEEP_NESTED_GIT;\n \tstruct strbuf directory = STRBUF_INIT;\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \tstatic const char **pathspec;\n \tstruct strbuf buf = STRBUF_INIT;\n \tconst char *qname;\ndiff --git a/builtin/fast-export.c b/builtin/fast-export.c\nindex 9fe25ff..8f26380 100644\n--- a/builtin/fast-export.c\n+++ b/builtin/fast-export.c\n@@ -147,7 +147,7 @@ static void handle_object(const unsigned char *sha1)\n \tfree(buf);\n }\n \n-static void show_filemodify(struct diff_queue_struct *q,\n+static void show_filemodify(struct diff_queue *q,\n \t\t\t    struct diff_options *options, void *data)\n {\n \tint i;\ndiff --git a/builtin/grep.c b/builtin/grep.c\nindex 597f76b..1f8d3c5 100644\n--- a/builtin/grep.c\n+++ b/builtin/grep.c\n@@ -724,7 +724,7 @@ static int grep_objects(struct grep_opt *opt, const char **paths,\n \n static int grep_directory(struct grep_opt *opt, const char **paths)\n {\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \tint i, hit = 0;\n \n \tmemset(&dir, 0, sizeof(dir));\ndiff --git a/builtin/ls-files.c b/builtin/ls-files.c\nindex cc202c5..81949f8 100644\n--- a/builtin/ls-files.c\n+++ b/builtin/ls-files.c\n@@ -65,7 +65,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent)\n \twrite_name(ent->name, ent->len);\n }\n \n-static void show_other_files(struct dir_struct *dir)\n+static void show_other_files(struct dir_table *dir)\n {\n \tint i;\n \n@@ -77,7 +77,7 @@ static void show_other_files(struct dir_struct *dir)\n \t}\n }\n \n-static void show_killed_files(struct dir_struct *dir)\n+static void show_killed_files(struct dir_table *dir)\n {\n \tint i;\n \tfor (i = 0; i < dir->nr; i++) {\n@@ -201,7 +201,7 @@ static void show_ru_info(void)\n \tfor_each_string_list(the_index.resolve_undo, show_one_ru, NULL);\n }\n \n-static void show_files(struct dir_struct *dir)\n+static void show_files(struct dir_table *dir)\n {\n \tint i;\n \n@@ -451,7 +451,7 @@ static int option_parse_exclude(const struct option *opt,\n static int option_parse_exclude_from(const struct option *opt,\n \t\t\t\t     const char *arg, int unset)\n {\n-\tstruct dir_struct *dir = opt->value;\n+\tstruct dir_table *dir = opt->value;\n \n \texc_given = 1;\n \tadd_excludes_from_file(dir, arg);\n@@ -462,7 +462,7 @@ static int option_parse_exclude_from(const struct option *opt,\n static int option_parse_exclude_standard(const struct option *opt,\n \t\t\t\t\t const char *arg, int unset)\n {\n-\tstruct dir_struct *dir = opt->value;\n+\tstruct dir_table *dir = opt->value;\n \n \texc_given = 1;\n \tsetup_standard_excludes(dir);\n@@ -474,7 +474,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)\n {\n \tint require_work_tree = 0, show_tag = 0;\n \tconst char *max_prefix;\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \tstruct option builtin_ls_files_options[] = {\n \t\t{ OPTION_CALLBACK, 'z', NULL, NULL, NULL,\n \t\t\t\"paths are separated with NUL character\",\ndiff --git a/builtin/merge.c b/builtin/merge.c\nindex 37ce4f5..9ec2a81 100644\n--- a/builtin/merge.c\n+++ b/builtin/merge.c\n@@ -657,7 +657,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,\n \t}\n }\n \n-static void count_diff_files(struct diff_queue_struct *q,\n+static void count_diff_files(struct diff_queue *q,\n \t\t\t     struct diff_options *opt, void *data)\n {\n \tint *count = data;\n@@ -682,7 +682,7 @@ int checkout_fast_forward(const unsigned char *head, const unsigned char *remote\n \tstruct unpack_trees_options opts;\n \tstruct tree_desc t[MAX_UNPACK_TREES];\n \tint i, fd, nr_trees = 0;\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \tstruct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));\n \n \trefresh_cache(REFRESH_QUIET);\ndiff --git a/builtin/read-tree.c b/builtin/read-tree.c\nindex 9ad1e66..f46ebcb 100644\n--- a/builtin/read-tree.c\n+++ b/builtin/read-tree.c\n@@ -46,7 +46,7 @@ static int index_output_cb(const struct option *opt, const char *arg,\n static int exclude_per_directory_cb(const struct option *opt, const char *arg,\n \t\t\t\t    int unset)\n {\n-\tstruct dir_struct *dir;\n+\tstruct dir_table *dir;\n \tstruct unpack_trees_options *opts;\n \n \topts = (struct unpack_trees_options *)opt->value;\ndiff --git a/builtin/reset.c b/builtin/reset.c\nindex 1283068..22abb49 100644\n--- a/builtin/reset.c\n+++ b/builtin/reset.c\n@@ -149,7 +149,7 @@ static int update_index_refresh(int fd, struct lock_file *index_lock, int flags)\n \treturn result;\n }\n \n-static void update_index_from_diff(struct diff_queue_struct *q,\n+static void update_index_from_diff(struct diff_queue *q,\n \t\tstruct diff_options *opt, void *data)\n {\n \tint i;\ndiff --git a/combine-diff.c b/combine-diff.c\nindex 655fa89..bd1b0d9 100644\n--- a/combine-diff.c\n+++ b/combine-diff.c\n@@ -10,7 +10,7 @@\n \n static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tstruct combine_diff_path *p;\n \tint i;\n \ndiff --git a/diff.c b/diff.c\nindex 17873f3..cf92ce4 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1509,7 +1509,7 @@ static void show_dirstat(struct diff_options *options)\n \tint i;\n \tunsigned long changed;\n \tstruct dirstat_dir dir;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \n \tdir.files = NULL;\n \tdir.alloc = 0;\n@@ -3284,9 +3284,9 @@ static int diff_scoreopt_parse(const char *opt)\n \treturn opt1 | (opt2 << 16);\n }\n \n-struct diff_queue_struct diff_queued_diff;\n+struct diff_queue diff_queued_diff;\n \n-void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)\n+void diff_q(struct diff_queue *queue, struct diff_filepair *dp)\n {\n \tif (queue->alloc <= queue->nr) {\n \t\tqueue->alloc = alloc_nr(queue->alloc);\n@@ -3296,7 +3296,7 @@ void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)\n \tqueue->queue[queue->nr++] = dp;\n }\n \n-struct diff_filepair *diff_queue(struct diff_queue_struct *queue,\n+struct diff_filepair *diff_queue(struct diff_queue *queue,\n \t\t\t\t struct diff_filespec *one,\n \t\t\t\t struct diff_filespec *two)\n {\n@@ -3449,7 +3449,7 @@ static void diff_flush_checkdiff(struct diff_filepair *p,\n \n int diff_queue_is_empty(void)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tint i;\n \tfor (i = 0; i < q->nr; i++)\n \t\tif (!diff_unmodified_pair(q->queue[i]))\n@@ -3480,7 +3480,7 @@ void diff_debug_filepair(const struct diff_filepair *p, int i)\n \t\tp->one->rename_used, p->broken_pair);\n }\n \n-void diff_debug_queue(const char *msg, struct diff_queue_struct *q)\n+void diff_debug_queue(const char *msg, struct diff_queue *q)\n {\n \tint i;\n \tif (msg)\n@@ -3497,7 +3497,7 @@ static void diff_resolve_rename_copy(void)\n {\n \tint i;\n \tstruct diff_filepair *p;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \n \tdiff_debug_queue(\"resolve-rename-copy\", q);\n \n@@ -3688,7 +3688,7 @@ static void patch_id_consume(void *priv, char *line, unsigned long len)\n /* returns 0 upon success, and writes result into sha1 */\n static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tint i;\n \tgit_SHA_CTX ctx;\n \tstruct patch_id_t data;\n@@ -3771,7 +3771,7 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)\n \n int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tint i;\n \tint result = diff_get_patch_id(options, sha1);\n \n@@ -3784,7 +3784,7 @@ int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1)\n \treturn result;\n }\n \n-static int is_summary_empty(const struct diff_queue_struct *q)\n+static int is_summary_empty(const struct diff_queue *q)\n {\n \tint i;\n \n@@ -3811,7 +3811,7 @@ static int is_summary_empty(const struct diff_queue_struct *q)\n \n void diff_flush(struct diff_options *options)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tint i, output_format = options->output_format;\n \tint separator = 0;\n \n@@ -3928,8 +3928,8 @@ free_queue:\n static void diffcore_apply_filter(const char *filter)\n {\n \tint i;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue *q = &diff_queued_diff;\n+\tstruct diff_queue outq;\n \tDIFF_QUEUE_CLEAR(&outq);\n \n \tif (!filter)\n@@ -3996,8 +3996,8 @@ static int diff_filespec_is_identical(struct diff_filespec *one,\n static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)\n {\n \tint i;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue *q = &diff_queued_diff;\n+\tstruct diff_queue outq;\n \tDIFF_QUEUE_CLEAR(&outq);\n \n \tfor (i = 0; i < q->nr; i++) {\n@@ -4053,7 +4053,7 @@ static int diffnamecmp(const void *a_, const void *b_)\n \n void diffcore_fix_diff_index(struct diff_options *options)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tqsort(q->queue, q->nr, sizeof(q->queue[0]), diffnamecmp);\n }\n \ndiff --git a/diff.h b/diff.h\nindex 063d10a..62aca85 100644\n--- a/diff.h\n+++ b/diff.h\n@@ -8,7 +8,7 @@\n \n struct rev_info;\n struct diff_options;\n-struct diff_queue_struct;\n+struct diff_queue;\n struct strbuf;\n struct diff_filespec;\n struct userdiff_driver;\n@@ -25,7 +25,7 @@ typedef void (*add_remove_fn_t)(struct diff_options *options,\n \t\t    const unsigned char *sha1,\n \t\t    const char *fullpath, unsigned dirty_submodule);\n \n-typedef void (*diff_format_fn_t)(struct diff_queue_struct *q,\n+typedef void (*diff_format_fn_t)(struct diff_queue *q,\n \t\tstruct diff_options *options, void *data);\n \n typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data);\ndiff --git a/diffcore-break.c b/diffcore-break.c\nindex 44f8678..ffda61f 100644\n--- a/diffcore-break.c\n+++ b/diffcore-break.c\n@@ -114,8 +114,8 @@ static int should_break(struct diff_filespec *src,\n \n void diffcore_break(int break_score)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue *q = &diff_queued_diff;\n+\tstruct diff_queue outq;\n \n \t/* When the filepair has this much edit (insert and delete),\n \t * it is first considered to be a rewrite and broken into a\n@@ -223,7 +223,7 @@ void diffcore_break(int break_score)\n \n static void merge_broken(struct diff_filepair *p,\n \t\t\t struct diff_filepair *pp,\n-\t\t\t struct diff_queue_struct *outq)\n+\t\t\t struct diff_queue *outq)\n {\n \t/* p and pp are broken pairs we want to merge */\n \tstruct diff_filepair *c = p, *d = pp, *dp;\n@@ -251,8 +251,8 @@ static void merge_broken(struct diff_filepair *p,\n \n void diffcore_merge_broken(void)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue *q = &diff_queued_diff;\n+\tstruct diff_queue outq;\n \tint i, j;\n \n \tDIFF_QUEUE_CLEAR(&outq);\ndiff --git a/diffcore-order.c b/diffcore-order.c\nindex 23e9385..9e69f67 100644\n--- a/diffcore-order.c\n+++ b/diffcore-order.c\n@@ -102,7 +102,7 @@ static int compare_pair_order(const void *a_, const void *b_)\n \n void diffcore_order(const char *orderfile)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tstruct pair_order *o;\n \tint i;\n \ndiff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c\nindex 929de15..4b5865b 100644\n--- a/diffcore-pickaxe.c\n+++ b/diffcore-pickaxe.c\n@@ -50,11 +50,11 @@ static unsigned int contains(struct diff_filespec *one,\n \n void diffcore_pickaxe(const char *needle, int opts)\n {\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tunsigned long len = strlen(needle);\n \tint i, has_changes;\n \tregex_t regex, *regexp = NULL;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue outq;\n \tDIFF_QUEUE_CLEAR(&outq);\n \n \tif (opts & DIFF_PICKAXE_REGEX) {\ndiff --git a/diffcore-rename.c b/diffcore-rename.c\nindex df41be5..a2a9f19 100644\n--- a/diffcore-rename.c\n+++ b/diffcore-rename.c\n@@ -419,8 +419,8 @@ void diffcore_rename(struct diff_options *options)\n \tint detect_rename = options->detect_rename;\n \tint minimum_score = options->rename_score;\n \tint rename_limit = options->rename_limit;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n-\tstruct diff_queue_struct outq;\n+\tstruct diff_queue *q = &diff_queued_diff;\n+\tstruct diff_queue outq;\n \tstruct diff_score *mx;\n \tint i, j, rename_count;\n \tint num_create, num_src, dst_cnt;\ndiff --git a/diffcore.h b/diffcore.h\nindex 491bea0..12cb8f7 100644\n--- a/diffcore.h\n+++ b/diffcore.h\n@@ -87,7 +87,7 @@ extern void diff_free_filepair(struct diff_filepair *);\n \n extern int diff_unmodified_pair(struct diff_filepair *);\n \n-struct diff_queue_struct {\n+struct diff_queue {\n \tstruct diff_filepair **queue;\n \tint alloc;\n \tint nr;\n@@ -100,11 +100,11 @@ struct diff_queue_struct {\n \t\t(q)->run = 0; \\\n \t} while(0);\n \n-extern struct diff_queue_struct diff_queued_diff;\n-extern struct diff_filepair *diff_queue(struct diff_queue_struct *,\n+extern struct diff_queue diff_queued_diff;\n+extern struct diff_filepair *diff_queue(struct diff_queue *,\n \t\t\t\t\tstruct diff_filespec *,\n \t\t\t\t\tstruct diff_filespec *);\n-extern void diff_q(struct diff_queue_struct *, struct diff_filepair *);\n+extern void diff_q(struct diff_queue *, struct diff_filepair *);\n \n extern void diffcore_break(int);\n extern void diffcore_rename(struct diff_options *);\n@@ -116,7 +116,7 @@ extern void diffcore_order(const char *orderfile);\n #if DIFF_DEBUG\n void diff_debug_filespec(struct diff_filespec *, int, const char *);\n void diff_debug_filepair(const struct diff_filepair *, int);\n-void diff_debug_queue(const char *, struct diff_queue_struct *);\n+void diff_debug_queue(const char *, struct diff_queue *);\n #else\n #define diff_debug_filespec(a,b,c) do {} while(0)\n #define diff_debug_filepair(a,b) do {} while(0)\ndiff --git a/dir.c b/dir.c\nindex 133f472..21539aa 100644\n--- a/dir.c\n+++ b/dir.c\n@@ -14,7 +14,7 @@ struct path_simplify {\n \tconst char *path;\n };\n \n-static int read_directory_recursive(struct dir_struct *dir, const char *path, int len,\n+static int read_directory_recursive(struct dir_table *dir, const char *path, int len,\n \tint check_only, const struct path_simplify *simplify);\n static int get_dtype(struct dirent *de, const char *path, int len);\n \n@@ -51,7 +51,7 @@ static int common_prefix(const char **pathspec)\n \treturn prefix;\n }\n \n-int fill_directory(struct dir_struct *dir, const char **pathspec)\n+int fill_directory(struct dir_table *dir, const char **pathspec)\n {\n \tconst char *path;\n \tint len;\n@@ -282,14 +282,14 @@ int add_excludes_from_file_to_list(const char *fname,\n \treturn 0;\n }\n \n-void add_excludes_from_file(struct dir_struct *dir, const char *fname)\n+void add_excludes_from_file(struct dir_table *dir, const char *fname)\n {\n \tif (add_excludes_from_file_to_list(fname, \"\", 0, NULL,\n \t\t\t\t\t   &dir->exclude_list[EXC_FILE], 0) < 0)\n \t\tdie(\"cannot use %s as an exclude file\", fname);\n }\n \n-static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)\n+static void prep_exclude(struct dir_table *dir, const char *base, int baselen)\n {\n \tstruct exclude_list *el;\n \tstruct exclude_stack *stk = NULL;\n@@ -413,7 +413,7 @@ int excluded_from_list(const char *pathname,\n \treturn -1; /* undecided */\n }\n \n-int excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)\n+int excluded(struct dir_table *dir, const char *pathname, int *dtype_p)\n {\n \tint pathlen = strlen(pathname);\n \tint st;\n@@ -444,7 +444,7 @@ static struct dir_entry *dir_entry_new(const char *pathname, int len)\n \treturn ent;\n }\n \n-static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len)\n+static struct dir_entry *dir_add_name(struct dir_table *dir, const char *pathname, int len)\n {\n \tif (cache_name_exists(pathname, len, ignore_case))\n \t\treturn NULL;\n@@ -453,7 +453,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna\n \treturn dir->entries[dir->nr++] = dir_entry_new(pathname, len);\n }\n \n-struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)\n+struct dir_entry *dir_add_ignored(struct dir_table *dir, const char *pathname, int len)\n {\n \tif (!cache_name_is_other(pathname, len))\n \t\treturn NULL;\n@@ -536,7 +536,7 @@ enum directory_treatment {\n \trecurse_into_directory\n };\n \n-static enum directory_treatment treat_directory(struct dir_struct *dir,\n+static enum directory_treatment treat_directory(struct dir_table *dir,\n \tconst char *dirname, int len,\n \tconst struct path_simplify *simplify)\n {\n@@ -687,7 +687,7 @@ enum path_treatment {\n \tpath_recurse\n };\n \n-static enum path_treatment treat_one_path(struct dir_struct *dir,\n+static enum path_treatment treat_one_path(struct dir_table *dir,\n \t\t\t\t\t  char *path, int *len,\n \t\t\t\t\t  const struct path_simplify *simplify,\n \t\t\t\t\t  int dtype, struct dirent *de)\n@@ -743,7 +743,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir,\n \treturn path_handled;\n }\n \n-static enum path_treatment treat_path(struct dir_struct *dir,\n+static enum path_treatment treat_path(struct dir_table *dir,\n \t\t\t\t      struct dirent *de,\n \t\t\t\t      char *path, int path_max,\n \t\t\t\t      int baselen,\n@@ -776,7 +776,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,\n  * Also, we ignore the name \".git\" (even if it is not a directory).\n  * That likely will not change.\n  */\n-static int read_directory_recursive(struct dir_struct *dir,\n+static int read_directory_recursive(struct dir_table *dir,\n \t\t\t\t    const char *base, int baselen,\n \t\t\t\t    int check_only,\n \t\t\t\t    const struct path_simplify *simplify)\n@@ -869,7 +869,7 @@ static void free_simplify(struct path_simplify *simplify)\n \tfree(simplify);\n }\n \n-static int treat_leading_path(struct dir_struct *dir,\n+static int treat_leading_path(struct dir_table *dir,\n \t\t\t      const char *path, int len,\n \t\t\t      const struct path_simplify *simplify)\n {\n@@ -904,7 +904,7 @@ static int treat_leading_path(struct dir_struct *dir,\n \t}\n }\n \n-int read_directory(struct dir_struct *dir, const char *path, int len, const char **pathspec)\n+int read_directory(struct dir_table *dir, const char *path, int len, const char **pathspec)\n {\n \tstruct path_simplify *simplify;\n \n@@ -1040,7 +1040,7 @@ int remove_dir_recursively(struct strbuf *path, int flag)\n \treturn ret;\n }\n \n-void setup_standard_excludes(struct dir_struct *dir)\n+void setup_standard_excludes(struct dir_table *dir)\n {\n \tconst char *path;\n \ndiff --git a/dir.h b/dir.h\nindex 278d84c..f2a02a0 100644\n--- a/dir.h\n+++ b/dir.h\n@@ -31,7 +31,7 @@ struct exclude_stack {\n \tint exclude_ix;\n };\n \n-struct dir_struct {\n+struct dir_table {\n \tint nr, alloc;\n \tint ignored_nr, ignored_alloc;\n \tenum {\n@@ -66,16 +66,16 @@ struct dir_struct {\n #define MATCHED_EXACTLY 3\n extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen);\n \n-extern int fill_directory(struct dir_struct *dir, const char **pathspec);\n-extern int read_directory(struct dir_struct *, const char *path, int len, const char **pathspec);\n+extern int fill_directory(struct dir_table *dir, const char **pathspec);\n+extern int read_directory(struct dir_table *, const char *path, int len, const char **pathspec);\n \n extern int excluded_from_list(const char *pathname, int pathlen, const char *basename,\n \t\t\t      int *dtype, struct exclude_list *el);\n-extern int excluded(struct dir_struct *, const char *, int *);\n-struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len);\n+extern int excluded(struct dir_table *, const char *, int *);\n+struct dir_entry *dir_add_ignored(struct dir_table *dir, const char *pathname, int len);\n extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen,\n \t\t\t\t\t  char **buf_p, struct exclude_list *which, int check_index);\n-extern void add_excludes_from_file(struct dir_struct *, const char *fname);\n+extern void add_excludes_from_file(struct dir_table *, const char *fname);\n extern void add_exclude(const char *string, const char *base,\n \t\t\tint baselen, struct exclude_list *which);\n extern int file_exists(const char *);\n@@ -92,7 +92,7 @@ static inline int is_dot_or_dotdot(const char *name)\n \n extern int is_empty_dir(const char *dir);\n \n-extern void setup_standard_excludes(struct dir_struct *dir);\n+extern void setup_standard_excludes(struct dir_table *dir);\n \n #define REMOVE_DIR_EMPTY_ONLY 01\n #define REMOVE_DIR_KEEP_NESTED_GIT 02\ndiff --git a/git.c b/git.c\nindex f37028b..6d80171 100644\n--- a/git.c\n+++ b/git.c\n@@ -237,13 +237,13 @@ const char git_version_string[] = GIT_VERSION;\n  */\n #define NEED_WORK_TREE\t(1<<2)\n \n-struct cmd_struct {\n+struct cmd_desc {\n \tconst char *cmd;\n \tint (*fn)(int, const char **, const char *);\n \tint option;\n };\n \n-static int run_builtin(struct cmd_struct *p, int argc, const char **argv)\n+static int run_builtin(struct cmd_desc *p, int argc, const char **argv)\n {\n \tint status, help;\n \tstruct stat st;\n@@ -291,7 +291,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)\n static void handle_internal_command(int argc, const char **argv)\n {\n \tconst char *cmd = argv[0];\n-\tstatic struct cmd_struct commands[] = {\n+\tstatic struct cmd_desc commands[] = {\n \t\t{ \"add\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n \t\t{ \"stage\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n \t\t{ \"annotate\", cmd_annotate, RUN_SETUP },\n@@ -420,7 +420,7 @@ static void handle_internal_command(int argc, const char **argv)\n \t}\n \n \tfor (i = 0; i < ARRAY_SIZE(commands); i++) {\n-\t\tstruct cmd_struct *p = commands+i;\n+\t\tstruct cmd_desc *p = commands+i;\n \t\tif (strcmp(p->cmd, cmd))\n \t\t\tcontinue;\n \t\texit(run_builtin(p, argc, argv));\ndiff --git a/tree-diff.c b/tree-diff.c\nindex 1fb3e94..d4f07ee 100644\n--- a/tree-diff.c\n+++ b/tree-diff.c\n@@ -335,7 +335,7 @@ static inline int diff_might_be_rename(void)\n static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt)\n {\n \tstruct diff_options diff_opts;\n-\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct diff_queue *q = &diff_queued_diff;\n \tstruct diff_filepair *choice;\n \tconst char *paths[1];\n \tint i;\ndiff --git a/unpack-trees.c b/unpack-trees.c\nindex 8cf0da3..7845b84 100644\n--- a/unpack-trees.c\n+++ b/unpack-trees.c\n@@ -930,7 +930,7 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,\n \t */\n \tint namelen;\n \tint i;\n-\tstruct dir_struct d;\n+\tstruct dir_table d;\n \tchar *pathbuf;\n \tint cnt = 0;\n \tunsigned char sha1[20];\ndiff --git a/unpack-trees.h b/unpack-trees.h\nindex ef70eab..9eb9007 100644\n--- a/unpack-trees.h\n+++ b/unpack-trees.h\n@@ -36,7 +36,7 @@ struct unpack_trees_options {\n \t\t     gently;\n \tconst char *prefix;\n \tint cache_bottom;\n-\tstruct dir_struct *dir;\n+\tstruct dir_table *dir;\n \tmerge_fn_t fn;\n \tstruct unpack_trees_error_msgs msgs;\n \ndiff --git a/wt-status.c b/wt-status.c\nindex 2f9e33c..34a402b 100644\n--- a/wt-status.c\n+++ b/wt-status.c\n@@ -220,7 +220,7 @@ static void wt_status_print_change_data(struct wt_status *s,\n \tstrbuf_release(&twobuf);\n }\n \n-static void wt_status_collect_changed_cb(struct diff_queue_struct *q,\n+static void wt_status_collect_changed_cb(struct diff_queue *q,\n \t\t\t\t\t struct diff_options *options,\n \t\t\t\t\t void *data)\n {\n@@ -270,7 +270,7 @@ static int unmerged_mask(const char *path)\n \treturn mask;\n }\n \n-static void wt_status_collect_updated_cb(struct diff_queue_struct *q,\n+static void wt_status_collect_updated_cb(struct diff_queue *q,\n \t\t\t\t\t struct diff_options *options,\n \t\t\t\t\t void *data)\n {\n@@ -373,7 +373,7 @@ static void wt_status_collect_changes_initial(struct wt_status *s)\n static void wt_status_collect_untracked(struct wt_status *s)\n {\n \tint i;\n-\tstruct dir_struct dir;\n+\tstruct dir_table dir;\n \n \tif (!s->show_untracked_files)\n \t\treturn;\n-- \n1.7.2\n"},{"id":"147216","messageId":"AANLkTin_6gaYF++N2GBgDsedfo7mY7yG5H99=-DxCa5E@mail.gmail.com","threadId":"24631","inReplyTo":"7vaap2fafm.fsf@alter.siamese.dyndns.org","subject":"Re: [RFC] struct *_struct","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2010-08-05T16:20:14Z","receivedAt":"2010-08-05T16:20:14Z","isPatch":false,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Wed, Aug 4, 2010 at 14:24, Junio C Hamano <gitster@pobox.com> wrote:\n> I hate... \"typedef foo struct foo\"\n\nHow come?\n"},{"id":"147266","messageId":"20100805224321.GA22430@localhost.localdomain","threadId":"24631","inReplyTo":"AANLkTin_6gaYF++N2GBgDsedfo7mY7yG5H99=-DxCa5E@mail.gmail.com","subject":"Re: [RFC] struct *_struct","fromName":"Jared Hance","fromEmail":"jaredhance@gmail.com","sentAt":"2010-08-05T22:43:21Z","receivedAt":"2010-08-05T22:43:21Z","isPatch":false,"sender":{"key":"jaredhance@gmail.com","avatar":"https://avatars.githubusercontent.com/u/170192?v=4"},"body":"On Thu, Aug 05, 2010 at 11:20:14AM -0500, Michael Witten wrote:\n> On Wed, Aug 4, 2010 at 14:24, Junio C Hamano <gitster@pobox.com> wrote:\n> > I hate... \"typedef foo struct foo\"\n> \n> How come?\n\nIn my opinion, it creates ambiguity. If I have\n    \n    typedef struct foo foo;\n\nAnd I have \"foo\" used in a code snippet, it is much less easier to see\nif foo is being used in the type context or if its an instance, since\nI like to do\n\n    struct foo foo;\n\nwhich reads much less well as:\n\n    foo foo;\n\n\nIts also much less easier to grep though to find all the places the\ntype is used. If I do\n\n    $ git grep \"foo\"\n\nI will end up with the instances and the struct type. whereas I can do\n\n    $ git grep \"struct foo\"\n\nto find (most|all) of the types, depending on whether the code uses\ndecent practices (there shouldn't be a second space between struct and\nfoo, or a newline between them).\n\nI could also use a similar regular expression to find all the\ninstances (ie, all the instances of foo that aren't prefixed with\nstruct).\n"},{"id":"147276","messageId":"87y6ckiiew.fsf@catnip.gol.com","threadId":"24631","inReplyTo":"AANLkTin_6gaYF++N2GBgDsedfo7mY7yG5H99=-DxCa5E@mail.gmail.com","subject":"Re: [RFC] struct *_struct","fromName":"Miles Bader","fromEmail":"miles@gnu.org","sentAt":"2010-08-06T02:28:23Z","receivedAt":"2010-08-06T02:28:23Z","isPatch":false,"sender":{"key":"miles@gnu.org","avatar":"https://gravatar.com/avatar/01069b69593af7bff28e2f97afeb3644ae6fe2f5f56cb3a8cf34c5fb8c36efe5?d=mp&s=160"},"body":"Michael Witten <mfwitten@gmail.com> writes:\n> On Wed, Aug 4, 2010 at 14:24, Junio C Hamano <gitster@pobox.com> wrote:\n>> I hate... \"typedef foo struct foo\"\n>\n> How come?\n\nThere is a practical issue in that \"struct foo *\" can be used with just\na forward declaration (or no declaration at all), whereas \"foo *\"\nrequires the declaration of foo be visible.  This is especially handy\ngiven C's use of #include, because in cases where there are circular\ntype references, it can be very annoying to get things #included in the\nright order; being able to use a forward declaration instead of #include\nmakes it easy to break such loops.  One can still use \"struct foo *\"\neven if there are typedefs, of course, but that breaks the illusion that\n\"foo\" is an abstract type, and I gather that illusion is one reason\npeople like the typedefs in the first place.\n\nBut I think mainly it's an issue of style/culture:\n\nSome codebases use \"typedef style\" (obviously those in C++, since the\ntypedefs are automatically), and in those codebases programmers will\nnaturally choose typenames that are more distinct (e.g., the common\nconvention of using StudlyCaps for types).  Some codebases use \"struct\nstyle\" (in C programs I think this is more common, as C-programming\nculture tends to value explicitness and simplicity).\n\nOne should use follow whatever style is common in the codebase one is\nworking on.  If git uses \"struct foo\" generally, new code should use\n\"struct bar\".\n\n-miles\n\n-- \nArrest, v. Formally to detain one accused of unusualness.\n"},{"id":"147294","messageId":"4c5b8819.4f3fdc0a.14ad.22b1@mx.google.com","threadId":"24631","inReplyTo":"20100805224321.GA22430@localhost.localdomain","subject":"Re: [RFC] struct *_struct","fromName":"Michael Witten","fromEmail":"mfwitten@gmail.com","sentAt":"2010-08-06T03:57:13Z","receivedAt":"2010-08-06T03:57:13Z","isPatch":false,"sender":{"key":"mfwitten@gmail.com","avatar":"https://avatars.githubusercontent.com/u/597101?v=4"},"body":"On Wed, Aug 4, 2010 at 14:24, Junio C Hamano <gitster@pobox.com> wrote:\n>>> I hate... \"typedef foo struct foo\"\n\nOn Thu, Aug 05, 2010 at 11:20:14AM -0500, Michael Witten wrote:\n>> How come?\n\nOn Thu, Aug 5, 2010 at 17:43, Jared Hance <jaredhance@gmail.com> wrote:\n> In my opinion, it creates ambiguity. If I have\n>\n>    typedef struct foo foo;\n>\n> And I have \"foo\" used in a code snippet, it is much less easier to see\n> if foo is being used in the type context or if its an instance, since\n> I like to do\n>\n>    struct foo foo;\n>\n> which reads much less well as:\n>\n>    foo foo;\n>\n>\n> Its also much less easier to grep though to find all the places the\n> type is used. If I do\n>\n>    $ git grep \"foo\"\n>\n> I will end up with the instances and the struct type. whereas I can do\n>\n>    $ git grep \"struct foo\"\n>\n> to find (most|all) of the types, depending on whether the code uses\n> decent practices (there shouldn't be a second space between struct and\n> foo, or a newline between them).\n>\n> I could also use a similar regular expression to find all the\n> instances (ie, all the instances of foo that aren't prefixed with\n> struct).\n\nThose are valid points, but I'm not sure they have a practical basis;\nyour problems are largely solved by capitalization conventions\n(which essentially provide shorter replacements for `struct '):\n\n    typedef struct { /* ... */ } Foo;\n    Foo foo;\n\nUnfortunately, such conventions don't enjoy the benefit of semantic\nprotection. However, language-aware source navigation tools (like ctags)\nshould be able to solve that problem and are probably more efficient\nin navigation time than grepping.\n\nMoreover, the form:\n\n    foo foo;\n\nis probably not that problematic in practice; it's presence is likely\nto be short lived for 2 reasons:\n\n    * Subjectively : everyone thinks it looks awful.\n    * Objectively  : It's technically constrained.\n\nThe typedef declaration:\n\n    typedef /*type*/ foo;\n\nintroduces the typedef name `foo' into the `ordinary identifier'\nname space; consequently, the declaration:\n\n    foo foo;\n\ncannot even occur in the same scope as the typdef, and when\nit does occur in an inner scope, it hides the original typdef\nname `foo' for all subsequent inner scopes:\n\n    typedef struct {char x;} foo;\n\n    foo foo;         // error: attempt to redeclare `foo'.\n    foo a;\n\n    int main()\n    {\n\n      foo foo;       // OK; hide typedef name with variable `foo'\n      foo b;         // error: `foo' is not a type.\n\n      {\n\n        foo c;       // error: `foo' is not a type.\n\n        typedef struct {char x;} foo;   // OK; hide variable `foo'\n\n        foo foo;     // error: attempt to redeclare `foo'\n        foo d;\n\n        d = a;       // error: anonymous structs are always different types.\n\n        {\n          foo foo;   // OK; hide typedef name with variable `foo'\n          d = foo;   // OK; same type\n          foo e;     // error: `foo' is not a type.\n        }\n\n        {\n          foo foo;   // OK; hide typedef name with variable `foo'\n          d = foo;   // OK; same type\n          foo f;     // error: `foo' is not a type.\n        }\n\n      }\n\n    }\n\nSincerely,\nMichael Witten\n"},{"id":"147308","messageId":"20100806122920.GA2346@localhost.localdomain","threadId":"24631","inReplyTo":"4c5b8819.4f3fdc0a.14ad.22b1@mx.google.com","subject":"Re: [RFC] struct *_struct","fromName":"Jared Hance","fromEmail":"jaredhance@gmail.com","sentAt":"2010-08-06T12:29:20Z","receivedAt":"2010-08-06T12:29:20Z","isPatch":false,"sender":{"key":"jaredhance@gmail.com","avatar":"https://avatars.githubusercontent.com/u/170192?v=4"},"body":"On Thu, Aug 05, 2010 at 08:57:13PM -0700, Michael Witten wrote:\n> On Wed, Aug 4, 2010 at 14:24, Junio C Hamano <gitster@pobox.com> wrote:\n> >>> I hate... \"typedef foo struct foo\"\n> \n> On Thu, Aug 05, 2010 at 11:20:14AM -0500, Michael Witten wrote:\n> >> How come?\n> \n> On Thu, Aug 5, 2010 at 17:43, Jared Hance <jaredhance@gmail.com> wrote:\n> Those are valid points, but I'm not sure they have a practical basis;\n> your problems are largely solved by capitalization conventions\n> (which essentially provide shorter replacements for `struct '):\n> \n>     typedef struct { /* ... */ } Foo;\n>     Foo foo;\n\nI agree, thats much better. The original hate was on \"struct foo foo\".\nFor some reason, I still prefer the version without the typedef,\nthough.\n\n> Unfortunately, such conventions don't enjoy the benefit of semantic\n> protection. However, language-aware source navigation tools (like ctags)\n> should be able to solve that problem and are probably more efficient\n> in navigation time than grepping.\n> \n> Moreover, the form:\n> \n>     foo foo;\n> \n> is probably not that problematic in practice; it's presence is likely\n> to be short lived for 2 reasons:\n> \n>     * Subjectively : everyone thinks it looks awful.\n>     * Objectively  : It's technically constrained.\n> \n> The typedef declaration:\n> \n>     typedef /*type*/ foo;\n> \n> introduces the typedef name `foo' into the `ordinary identifier'\n> name space; consequently, the declaration:\n> \n>     foo foo;\n> \n> cannot even occur in the same scope as the typdef, and when\n> it does occur in an inner scope, it hides the original typdef\n> name `foo' for all subsequent inner scopes:\n> \n>     typedef struct {char x;} foo;\n> \n>     foo foo;         // error: attempt to redeclare `foo'.\n>     foo a;\n> \n>     int main()\n>     {\n> \n>       foo foo;       // OK; hide typedef name with variable `foo'\n>       foo b;         // error: `foo' is not a type.\n> \n>       {\n> \n>         foo c;       // error: `foo' is not a type.\n> \n>         typedef struct {char x;} foo;   // OK; hide variable `foo'\n> \n>         foo foo;     // error: attempt to redeclare `foo'\n>         foo d;\n> \n>         d = a;       // error: anonymous structs are always different types.\n> \n>         {\n>           foo foo;   // OK; hide typedef name with variable `foo'\n>           d = foo;   // OK; same type\n>           foo e;     // error: `foo' is not a type.\n>         }\n> \n>         {\n>           foo foo;   // OK; hide typedef name with variable `foo'\n>           d = foo;   // OK; same type\n>           foo f;     // error: `foo' is not a type.\n>         }\n> \n>       }\n> \n>     }\n> \n> Sincerely,\n> Michael Witten\n\nI agree here too. By the way, my comments were mostly against\nspecifically \"typedef foo struct foo\", since that what was\nspecifically mentioned.\n"}]}