Merge branch 'linux1'
[oweals/cde.git] / cde / programs / dthelp / parser / pass2 / util / triecnt.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: triecnt.c /main/3 1995/11/08 11:08:29 rswiston $ */
24 /*
25                    Copyright 1986, 1987, 1988, 1989 Hewlett-Packard Co.
26 */
27
28 /* Triecnt.c contains procedures for writing out a trie structure */
29
30 #include <stdio.h>
31 #include "basic.h"
32 #include "trie.h"
33
34 void countdown(
35 #if defined(M_PROTO)
36   M_TRIE *parent, int *count
37 #endif
38   ) ;
39
40 void dumpnode(
41 #if defined(M_PROTO)
42   LOGICAL *first, FILE *file, M_TRIE *trieptr, int *count,
43     void (*proc)(FILE *file, void *value)
44 #endif
45   ) ;
46
47 void printval(
48 #if defined(M_PROTO)
49   FILE *file, void *value
50 #endif
51   ) ;
52
53 /* Count the descendants of a node in order to generate declarations for
54    the packed form of a trie*/
55 void countdown(parent, count)
56   M_TRIE *parent ;
57   int *count ;
58   {
59     M_TRIE *child ;
60
61     for (child = parent->data ; child ; child = child->next) {
62       (*count)++ ;
63       if (child->symbol) countdown(child, count) ;
64       }
65     }
66
67 /* Output descendants of a node for the declaration of a trie, in packed
68    or normal format*/
69 void dumpnode(first, file, trieptr, count, proc)
70   LOGICAL *first ;
71   FILE *file ;
72   M_TRIE *trieptr ;
73   int *count ;
74   void (*proc) (
75 #if defined (M_PROTO)
76     FILE *file, 
77     void *value
78 #endif
79     ) ;
80   {
81     M_TRIE *p ;
82     int savecount ;
83
84     for (p = trieptr->data ; p ; p = p->next) (*count)++ ;
85     savecount = *count ;
86
87     for (p = trieptr->data ; p ; p = p->next) {
88       /* generate a child */
89       if (*first) *first = FALSE ;
90       else fprintf(file, ",\n") ;
91       fprintf(file, "  ") ;
92       if (p->next) fprintf(file, "TRUE, ") ;
93       else fprintf(file, "FALSE, ") ;
94       fprintf(file, "%d", p->symbol) ;
95       if (p->symbol) fprintf(file, ", %d", *count) ;
96       else (*proc)(file, p->data) ;
97
98       /* count the children of the child*/
99       if (p->symbol) countdown(p, count) ;
100       }
101
102     *count = savecount ;
103     for (p = trieptr->data ; p ; p = p->next)
104       if (p->symbol) dumpnode(first, file, p, count, proc) ;
105     }
106
107
108 /* Most common procedure passed to dumpptrie */
109 void printval(file, value)
110   FILE *file ;
111   void *value ;
112   {
113     fprintf(file, ", %d", (int) value) ;
114     }