From: Johan Herland <johan@herland.net>
To: git@vger.kernel.org
Cc: johan@herland.net, jrnieder@gmail.com, bebarino@gmail.com,
avarab@gmail.com, gitster@pobox.com, srabbelier@gmail.com
Subject: [PATCHv6 04/23] notes.c: Reorder functions in preparation for next commit
Date: Tue, 09 Nov 2010 22:49:40 +0100 [thread overview]
Message-ID: <1289339399-4733-5-git-send-email-johan@herland.net> (raw)
In-Reply-To: <1289339399-4733-1-git-send-email-johan@herland.net>
This patch introduces no functional change. It consists solely of reordering
functions in notes.c to avoid use-before-declaration errors after applying
the next commit in this series.
Signed-off-by: Johan Herland <johan@herland.net>
---
notes.c | 146 +++++++++++++++++++++++++++++++-------------------------------
1 files changed, 73 insertions(+), 73 deletions(-)
diff --git a/notes.c b/notes.c
index d71c0a3..bfb3ea5 100644
--- a/notes.c
+++ b/notes.c
@@ -150,6 +150,79 @@ static struct leaf_node *note_tree_find(struct notes_tree *t,
}
/*
+ * How to consolidate an int_node:
+ * If there are > 1 non-NULL entries, give up and return non-zero.
+ * Otherwise replace the int_node at the given index in the given parent node
+ * with the only entry (or a NULL entry if no entries) from the given tree,
+ * and return 0.
+ */
+static int note_tree_consolidate(struct int_node *tree,
+ struct int_node *parent, unsigned char index)
+{
+ unsigned int i;
+ void *p = NULL;
+
+ assert(tree && parent);
+ assert(CLR_PTR_TYPE(parent->a[index]) == tree);
+
+ for (i = 0; i < 16; i++) {
+ if (GET_PTR_TYPE(tree->a[i]) != PTR_TYPE_NULL) {
+ if (p) /* more than one entry */
+ return -2;
+ p = tree->a[i];
+ }
+ }
+
+ /* replace tree with p in parent[index] */
+ parent->a[index] = p;
+ free(tree);
+ return 0;
+}
+
+/*
+ * To remove a leaf_node:
+ * Search to the tree location appropriate for the given leaf_node's key:
+ * - If location does not hold a matching entry, abort and do nothing.
+ * - Replace the matching leaf_node with a NULL entry (and free the leaf_node).
+ * - Consolidate int_nodes repeatedly, while walking up the tree towards root.
+ */
+static void note_tree_remove(struct notes_tree *t, struct int_node *tree,
+ unsigned char n, struct leaf_node *entry)
+{
+ struct leaf_node *l;
+ struct int_node *parent_stack[20];
+ unsigned char i, j;
+ void **p = note_tree_search(t, &tree, &n, entry->key_sha1);
+
+ assert(GET_PTR_TYPE(entry) == 0); /* no type bits set */
+ if (GET_PTR_TYPE(*p) != PTR_TYPE_NOTE)
+ return; /* type mismatch, nothing to remove */
+ l = (struct leaf_node *) CLR_PTR_TYPE(*p);
+ if (hashcmp(l->key_sha1, entry->key_sha1))
+ return; /* key mismatch, nothing to remove */
+
+ /* we have found a matching entry */
+ free(l);
+ *p = SET_PTR_TYPE(NULL, PTR_TYPE_NULL);
+
+ /* consolidate this tree level, and parent levels, if possible */
+ if (!n)
+ return; /* cannot consolidate top level */
+ /* first, build stack of ancestors between root and current node */
+ parent_stack[0] = t->root;
+ for (i = 0; i < n; i++) {
+ j = GET_NIBBLE(i, entry->key_sha1);
+ parent_stack[i + 1] = CLR_PTR_TYPE(parent_stack[i]->a[j]);
+ }
+ assert(i == n && parent_stack[i] == tree);
+ /* next, unwind stack until note_tree_consolidate() is done */
+ while (i > 0 &&
+ !note_tree_consolidate(parent_stack[i], parent_stack[i - 1],
+ GET_NIBBLE(i - 1, entry->key_sha1)))
+ i--;
+}
+
+/*
* To insert a leaf_node:
* Search to the tree location appropriate for the given leaf_node's key:
* - If location is unused (NULL), store the tweaked pointer directly there
@@ -229,79 +302,6 @@ static void note_tree_insert(struct notes_tree *t, struct int_node *tree,
note_tree_insert(t, new_node, n + 1, entry, type, combine_notes);
}
-/*
- * How to consolidate an int_node:
- * If there are > 1 non-NULL entries, give up and return non-zero.
- * Otherwise replace the int_node at the given index in the given parent node
- * with the only entry (or a NULL entry if no entries) from the given tree,
- * and return 0.
- */
-static int note_tree_consolidate(struct int_node *tree,
- struct int_node *parent, unsigned char index)
-{
- unsigned int i;
- void *p = NULL;
-
- assert(tree && parent);
- assert(CLR_PTR_TYPE(parent->a[index]) == tree);
-
- for (i = 0; i < 16; i++) {
- if (GET_PTR_TYPE(tree->a[i]) != PTR_TYPE_NULL) {
- if (p) /* more than one entry */
- return -2;
- p = tree->a[i];
- }
- }
-
- /* replace tree with p in parent[index] */
- parent->a[index] = p;
- free(tree);
- return 0;
-}
-
-/*
- * To remove a leaf_node:
- * Search to the tree location appropriate for the given leaf_node's key:
- * - If location does not hold a matching entry, abort and do nothing.
- * - Replace the matching leaf_node with a NULL entry (and free the leaf_node).
- * - Consolidate int_nodes repeatedly, while walking up the tree towards root.
- */
-static void note_tree_remove(struct notes_tree *t, struct int_node *tree,
- unsigned char n, struct leaf_node *entry)
-{
- struct leaf_node *l;
- struct int_node *parent_stack[20];
- unsigned char i, j;
- void **p = note_tree_search(t, &tree, &n, entry->key_sha1);
-
- assert(GET_PTR_TYPE(entry) == 0); /* no type bits set */
- if (GET_PTR_TYPE(*p) != PTR_TYPE_NOTE)
- return; /* type mismatch, nothing to remove */
- l = (struct leaf_node *) CLR_PTR_TYPE(*p);
- if (hashcmp(l->key_sha1, entry->key_sha1))
- return; /* key mismatch, nothing to remove */
-
- /* we have found a matching entry */
- free(l);
- *p = SET_PTR_TYPE(NULL, PTR_TYPE_NULL);
-
- /* consolidate this tree level, and parent levels, if possible */
- if (!n)
- return; /* cannot consolidate top level */
- /* first, build stack of ancestors between root and current node */
- parent_stack[0] = t->root;
- for (i = 0; i < n; i++) {
- j = GET_NIBBLE(i, entry->key_sha1);
- parent_stack[i + 1] = CLR_PTR_TYPE(parent_stack[i]->a[j]);
- }
- assert(i == n && parent_stack[i] == tree);
- /* next, unwind stack until note_tree_consolidate() is done */
- while (i > 0 &&
- !note_tree_consolidate(parent_stack[i], parent_stack[i - 1],
- GET_NIBBLE(i - 1, entry->key_sha1)))
- i--;
-}
-
/* Free the entire notes data contained in the given tree */
static void note_tree_free(struct int_node *tree)
{
--
1.7.3.2.173.gab1c9.dirty
next prev parent reply other threads:[~2010-11-09 21:50 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-09 21:49 [PATCHv6 00/23] git notes merge Johan Herland
2010-11-09 21:49 ` [PATCHv6 01/23] notes.c: Hexify SHA1 in die() message from init_notes() Johan Herland
2010-11-09 21:49 ` [PATCHv6 02/23] (trivial) notes.h: Minor documentation fixes to copy_notes() Johan Herland
2010-11-09 21:49 ` [PATCHv6 03/23] notes.h: Make default_notes_ref() available in notes API Johan Herland
2010-11-09 21:49 ` Johan Herland [this message]
2010-11-09 21:49 ` [PATCHv6 05/23] notes.h/c: Allow combine_notes functions to remove notes Johan Herland
2010-11-09 21:49 ` [PATCHv6 06/23] notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond Johan Herland
2010-11-14 20:46 ` Thiago Farina
2010-11-14 21:22 ` Jonathan Nieder
2010-11-14 23:50 ` Johan Herland
2010-11-14 23:52 ` [PATCHv6.1 " Johan Herland
2010-11-14 23:54 ` [PATCHv6.1 12/23] git notes merge: Handle real, non-conflicting notes merges Johan Herland
2010-11-14 23:55 ` [PATCHv6.1 13/23] git notes merge: Add automatic conflict resolvers (ours, theirs, union) Johan Herland
2010-11-14 23:57 ` [PATCHv6.1 19/23] git notes merge: Add another auto-resolving strategy: "cat_sort_uniq" Johan Herland
2010-11-09 21:49 ` [PATCHv6 07/23] (trivial) t3303: Indent with tabs instead of spaces for consistency Johan Herland
2010-11-09 21:49 ` [PATCHv6 08/23] notes.c: Use two newlines (instead of one) when concatenating notes Johan Herland
2010-11-09 21:49 ` [PATCHv6 09/23] builtin/notes.c: Split notes ref DWIMmery into a separate function Johan Herland
2010-11-09 21:49 ` [PATCHv6 10/23] git notes merge: Initial implementation handling trivial merges only Johan Herland
2010-11-09 21:49 ` [PATCHv6 11/23] builtin/notes.c: Refactor creation of notes commits Johan Herland
2010-11-09 21:49 ` [PATCHv6 12/23] git notes merge: Handle real, non-conflicting notes merges Johan Herland
2010-11-09 21:49 ` [PATCHv6 13/23] git notes merge: Add automatic conflict resolvers (ours, theirs, union) Johan Herland
2010-11-09 21:49 ` [PATCHv6 14/23] Documentation: Preliminary docs on 'git notes merge' Johan Herland
2010-11-09 21:49 ` [PATCHv6 15/23] git notes merge: Manual conflict resolution, part 1/2 Johan Herland
2010-11-09 21:49 ` [PATCHv6 16/23] git notes merge: Manual conflict resolution, part 2/2 Johan Herland
2010-11-09 21:49 ` [PATCHv6 17/23] git notes merge: List conflicting notes in notes merge commit message Johan Herland
2010-11-09 21:49 ` [PATCHv6 18/23] git notes merge: --commit should fail if underlying notes ref has moved Johan Herland
2010-11-09 21:49 ` [PATCHv6 19/23] git notes merge: Add another auto-resolving strategy: "cat_sort_uniq" Johan Herland
2010-11-09 21:49 ` [PATCHv6 20/23] git notes merge: Add testcases for merging notes trees at different fanouts Johan Herland
2010-11-09 21:49 ` [PATCHv6 21/23] Provide 'git notes get-ref' to easily retrieve current notes ref Johan Herland
2010-11-09 21:49 ` [PATCHv6 22/23] cmd_merge(): Parse options before checking MERGE_HEAD Johan Herland
2010-11-09 21:49 ` [PATCHv6 23/23] Provide 'git merge --abort' as a synonym to 'git reset --merge' Johan Herland
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1289339399-4733-5-git-send-email-johan@herland.net \
--to=johan@herland.net \
--cc=avarab@gmail.com \
--cc=bebarino@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=srabbelier@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).