Example #1
0
        /* Do the increments */
        static void increment(huff_t *huff, node_t *node)
        {
            node_t *lnode;

            if (!node)
            {
                return;
            }

            if (node->next != NULL && node->next->weight == node->weight)
            {
                lnode = *node->head;
                if (lnode != node->parent)
                {
                    swap(huff, lnode, node);
                }
                swaplist(lnode, node);
            }
            if (node->prev && node->prev->weight == node->weight)
            {
                *node->head = node->prev;
            }
            else
            {
                *node->head = NULL;
                free_ppnode(huff, node->head);
            }
            node->weight++;
            if (node->next && node->next->weight == node->weight)
            {
                node->head = node->next->head;
            }
            else
            {
                node->head = get_ppnode(huff);
                *node->head = node;
            }
            if (node->parent)
            {
                increment(huff, node->parent);
                if (node->prev == node->parent)
                {
                    swaplist(node, node->parent);
                    if (*node->head == node)
                    {
                        *node->head = node->parent;
                    }
                }
            }
        }
Example #2
0
 /* Send the prefix code for this node */
 static void send(node_t *node, node_t *child, byte *fout)
 {
     if (node->parent)
     {
         send(node->parent, node, fout);
     }
     if (child)
     {
         if (node->right == child)
         {
             add_bit(1, fout);
         }
         else
         {
             add_bit(0, fout);
         }
     }
 }
Example #3
0
        /* Swap the location of these two nodes in the tree */
        static void swap(huff_t *huff, node_t *node1, node_t *node2)
        {
            node_t *par1, *par2;

            par1 = node1->parent;
            par2 = node2->parent;

            if (par1)
            {
                if (par1->left == node1)
                {
                    par1->left = node2;
                }
                else
                {
                    par1->right = node2;
                }
            }
            else
            {
                huff->tree = node2;
            }

            if (par2)
            {
                if (par2->left == node2)
                {
                    par2->left = node1;
                }
                else
                {
                    par2->right = node1;
                }
            }
            else
            {
                huff->tree = node1;
            }

            node1->parent = par2;
            node2->parent = par1;
        }
Example #4
0
 /* Get a symbol */
 int Huff_Receive(node_t *node, int *ch, byte *fin)
 {
     while (node && node->symbol == INTERNAL_NODE)
     {
         if (get_bit(fin))
         {
             node = node->right;
         }
         else
         {
             node = node->left;
         }
     }
     if (!node)
     {
         return(0);
         //		Com_Error(ERR_DROP, "Illegal tree!\n");
     }
     return(*ch = node->symbol);
 }
Example #5
0
 /* Get a symbol */
 void Huff_offsetReceive(node_t *node, int *ch, byte *fin, int *offset)
 {
     bloc = *offset;
     while (node && node->symbol == INTERNAL_NODE)
     {
         if (get_bit(fin))
         {
             node = node->right;
         }
         else
         {
             node = node->left;
         }
     }
     if (!node)
     {
         *ch = 0;
         return;
         //		Com_Error(ERR_DROP, "Illegal tree!\n");
     }
     *ch     = node->symbol;
     *offset = bloc;
 }
Example #6
0
        /* Swap these two nodes in the linked list (update ranks) */
        static void swaplist(node_t *node1, node_t *node2)
        {
            node_t *par1;

            par1        = node1->next;
            node1->next = node2->next;
            node2->next = par1;

            par1        = node1->prev;
            node1->prev = node2->prev;
            node2->prev = par1;

            if (node1->next == node1)
            {
                node1->next = node2;
            }
            if (node2->next == node2)
            {
                node2->next = node1;
            }
            if (node1->next)
            {
                node1->next->prev = node1;
            }
            if (node2->next)
            {
                node2->next->prev = node2;
            }
            if (node1->prev)
            {
                node1->prev->next = node1;
            }
            if (node2->prev)
            {
                node2->prev->next = node2;
            }
        }