better prime number generator. improved ELG key generation
[gnupg.git] / g10 / kbnode.c
1 /* kbnode.c -  keyblock node utility functions
2  *      Copyright (c) 1997 by Werner Koch (dd9jn)
3  *
4  * This file is part of G10.
5  *
6  * G10 is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * G10 is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26 #include "util.h"
27 #include "memory.h"
28 #include "packet.h"
29 #include "keydb.h"
30
31
32
33 KBNODE
34 new_kbnode( PACKET *pkt )
35 {
36     KBNODE n = m_alloc( sizeof *n );
37     n->next = NULL;
38     n->pkt = pkt;
39     n->child = NULL;
40     n->flag = 0;
41     return n;
42 }
43
44
45 void
46 release_kbnode( KBNODE n )
47 {
48     KBNODE n2;
49
50     while( n ) {
51         n2 = n->next;
52         release_kbnode( n->child );
53         free_packet( n->pkt );
54         m_free( n );
55         n = n2;
56     }
57 }
58
59
60 /****************
61  * Append NODE to ROOT, ROOT must exist!
62  */
63 void
64 add_kbnode( KBNODE root, KBNODE node )
65 {
66     KBNODE n1;
67
68     for(n1=root; n1->next; n1 = n1->next)
69         ;
70     n1->next = node;
71 }
72
73 /****************
74  * Append NODE to ROOT as child of ROOT
75  */
76 void
77 add_kbnode_as_child( KBNODE root, KBNODE node )
78 {
79     KBNODE n1;
80
81     if( !(n1=root->child) )
82         root->child = node;
83     else {
84         for( ; n1->next; n1 = n1->next)
85             ;
86         n1->next = node;
87     }
88 }
89
90 /****************
91  * Return the parent node of KBNODE from the tree with ROOT
92  */
93 KBNODE
94 find_kbparent( KBNODE root, KBNODE node )
95 {
96     KBNODE n, n2;
97
98     for( ; root; root = root->child) {
99         for( n = root; n; n = n->next) {
100             for( n2 = n->child; n2; n2 = n2->next ) {
101                 if( n2 == node )
102                     return n;
103             }
104         }
105     }
106     return NULL;
107 }
108
109
110 /****************
111  * Walk through a tree of kbnodes. This functions returns
112  * the next kbnode for each call; before using the function the first
113  * time, the caller must set CONTEXT to NULL (This has simply the effect
114  * to start with ROOT).
115  */
116 KBNODE
117 walk_kbtree( KBNODE root, KBNODE *context )
118 {
119     KBNODE n;
120
121     if( !*context ) {
122         *context = root;
123         return root;
124     }
125
126     n = *context;
127     if( n->child ) {
128         n = n->child;
129         *context = n;
130     }
131     else if( n->next ) {
132         n = n->next;
133         *context = n;
134     }
135     else if( (n = find_kbparent( root, n )) ) {
136         n = n->next;
137         *context = n;
138     }
139     return n;
140 }
141
142 void
143 clear_kbnode_flags( KBNODE n )
144 {
145     for( ; n; n = n->next ) {
146         clear_kbnode_flags( n->child );
147         n->flag = 0;
148     }
149 }