From ac415f5bb16db7225b5806f55ef4d69755580ebd Mon Sep 17 00:00:00 2001 From: Eric Smith Date: Sat, 8 Mar 2003 07:45:46 +0000 Subject: [PATCH] more code for pdf_split_name_tree_node(). --- pdf_name_tree.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/pdf_name_tree.c b/pdf_name_tree.c index de9dde1..e819a8d 100644 --- a/pdf_name_tree.c +++ b/pdf_name_tree.c @@ -4,7 +4,7 @@ * will be compressed using ITU-T T.6 (G4) fax encoding. * * PDF routines - * $Id: pdf_name_tree.c,v 1.4 2003/03/07 22:52:09 eric Exp $ + * $Id: pdf_name_tree.c,v 1.5 2003/03/07 23:45:46 eric Exp $ * Copyright 2003 Eric Smith * * This program is free software; you can redistribute it and/or modify @@ -90,9 +90,12 @@ struct pdf_name_tree *pdf_new_name_tree (pdf_file_handle pdf_file, static void pdf_split_name_tree_node (struct pdf_name_tree *tree, struct pdf_name_tree_node *node) { + struct pdf_name_tree_node *parent; struct pdf_name_tree_node *new_node; + int i, j; - if (node == tree->root) + parent = node->parent; + if (! parent) { /* create new root above current root */ struct pdf_name_tree_node *new_root_node; @@ -108,15 +111,71 @@ static void pdf_split_name_tree_node (struct pdf_name_tree *tree, new_root_node->min_key = node->min_key; new_root_node->max_key = node->max_key; + parent = new_root_node; node->parent = new_root_node; tree->root = new_root_node; } new_node = pdf_calloc (1, sizeof (struct pdf_name_tree_node)); - new_node->parent = node->parent; + new_node->parent = parent; new_node->leaf = node->leaf; - /* $$$ insert new node in parent's kids array */ + /* move half the node's entries into the new node */ + i = node->count / 2; + j = node->count - i; + + memcpy (& new_node->kids [0], + & node->kids [i], + j * sizeof (struct pdf_name_tree_node *)); + memcpy (& new_node->keys [0], + & node->keys [i], + j * sizeof (struct pdf_obj *)); + memcpy (& new_node->values [0], + & node->values [i], + j * sizeof (struct pdf_obj *)); + node->count = i; + new_node->count = j; + + /* set max_key of the old node */ + if (node->leaf) + node->max_key = node->keys [node->count - 1]; + else + node->max_key = node->kids [node->count - 1]->max_key; + + /* set min_key and max_key in the new node */ + if (new_node->leaf) + { + new_node->min_key = new_node->keys [0]; + new_node->max_key = new_node->keys [new_node->count - 1]; + } + else + { + new_node->min_key = new_node->kids [0]->min_key; + new_node->max_key = new_node->kids [new_node->count - 1]->max_key; + } + + /* insert new node in parent's kids array */ + /* find entry of old node */ + for (i = 0; i < parent->count; i++) + if (parent->kids [i] == node) + break; + + /* it had better have been there! */ + pdf_assert (i < parent->count); + + /* the new node goes in the slot to the right of the old node */ + i++; + + /* move other entries right one position */ + if (i != node->count) + { + memmove (& parent->kids [i+1], + & parent->kids [i], + (parent->count - i) * sizeof (struct pdf_name_tree_node *)); + } + + parent->kids [i] = new_node; + parent->count++; }