|
1 /* GObject - GLib Type, Object, Parameter and Signal Library |
|
2 * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. |
|
3 * |
|
4 * This library is free software; you can redistribute it and/or |
|
5 * modify it under the terms of the GNU Lesser General Public |
|
6 * License as published by the Free Software Foundation; either |
|
7 * version 2 of the License, or (at your option) any later version. |
|
8 * |
|
9 * This library is distributed in the hope that it will be useful, |
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
12 * Lesser General Public License for more details. |
|
13 * |
|
14 * You should have received a copy of the GNU Lesser General |
|
15 * Public License along with this library; if not, write to the |
|
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
|
17 * Boston, MA 02111-1307, USA. |
|
18 */ |
|
19 #include "../config.h" |
|
20 |
|
21 #include <glib-object.h> |
|
22 |
|
23 #include <glib/gprintf.h> |
|
24 #include <stdlib.h> |
|
25 #include <string.h> |
|
26 #ifdef HAVE_UNISTD_H |
|
27 #include <unistd.h> |
|
28 #endif |
|
29 #include <sys/stat.h> |
|
30 #include <fcntl.h> |
|
31 |
|
32 static gchar *indent_inc = NULL; |
|
33 static guint spacing = 1; |
|
34 static FILE *f_out = NULL; |
|
35 static GType root = 0; |
|
36 static gboolean recursion = TRUE; |
|
37 |
|
38 #if 0 |
|
39 # define O_SPACE "\\as" |
|
40 # define O_ESPACE " " |
|
41 # define O_BRANCH "\\aE" |
|
42 # define O_VLINE "\\al" |
|
43 # define O_LLEAF "\\aL" |
|
44 # define O_KEY_FILL "_" |
|
45 #else |
|
46 # define O_SPACE " " |
|
47 # define O_ESPACE "" |
|
48 # define O_BRANCH "+" |
|
49 # define O_VLINE "|" |
|
50 # define O_LLEAF "`" |
|
51 # define O_KEY_FILL "_" |
|
52 #endif |
|
53 |
|
54 static void |
|
55 show_nodes (GType type, |
|
56 GType sibling, |
|
57 const gchar *indent) |
|
58 { |
|
59 GType *children; |
|
60 guint i; |
|
61 |
|
62 if (!type) |
|
63 return; |
|
64 |
|
65 children = g_type_children (type, NULL); |
|
66 |
|
67 if (type != root) |
|
68 for (i = 0; i < spacing; i++) |
|
69 g_fprintf (f_out, "%s%s\n", indent, O_VLINE); |
|
70 |
|
71 g_fprintf (f_out, "%s%s%s%s", |
|
72 indent, |
|
73 sibling ? O_BRANCH : (type != root ? O_LLEAF : O_SPACE), |
|
74 O_ESPACE, |
|
75 g_type_name (type)); |
|
76 |
|
77 for (i = strlen (g_type_name (type)); i <= strlen (indent_inc); i++) |
|
78 fputs (O_KEY_FILL, f_out); |
|
79 |
|
80 fputc ('\n', f_out); |
|
81 |
|
82 if (children && recursion) |
|
83 { |
|
84 gchar *new_indent; |
|
85 GType *child; |
|
86 |
|
87 if (sibling) |
|
88 new_indent = g_strconcat (indent, O_VLINE, indent_inc, NULL); |
|
89 else |
|
90 new_indent = g_strconcat (indent, O_SPACE, indent_inc, NULL); |
|
91 |
|
92 for (child = children; *child; child++) |
|
93 show_nodes (child[0], child[1], new_indent); |
|
94 |
|
95 g_free (new_indent); |
|
96 } |
|
97 |
|
98 g_free (children); |
|
99 } |
|
100 |
|
101 static gint |
|
102 help (gchar *arg) |
|
103 { |
|
104 g_fprintf (stderr, "usage: query <qualifier> [-r <type>] [-{i|b} \"\"] [-s #] [-{h|x|y}]\n"); |
|
105 g_fprintf (stderr, " -r specifiy root type\n"); |
|
106 g_fprintf (stderr, " -n don't descend type tree\n"); |
|
107 g_fprintf (stderr, " -h guess what ;)\n"); |
|
108 g_fprintf (stderr, " -b specify indent string\n"); |
|
109 g_fprintf (stderr, " -i specify incremental indent string\n"); |
|
110 g_fprintf (stderr, " -s specify line spacing\n"); |
|
111 g_fprintf (stderr, "qualifiers:\n"); |
|
112 g_fprintf (stderr, " froots iterate over fundamental roots\n"); |
|
113 g_fprintf (stderr, " tree print type tree\n"); |
|
114 |
|
115 return arg != NULL; |
|
116 } |
|
117 |
|
118 int |
|
119 main (gint argc, |
|
120 gchar *argv[]) |
|
121 { |
|
122 GLogLevelFlags fatal_mask; |
|
123 gboolean gen_froots = 0; |
|
124 gboolean gen_tree = 0; |
|
125 gint i; |
|
126 gchar *iindent = ""; |
|
127 |
|
128 f_out = stdout; |
|
129 |
|
130 fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); |
|
131 fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; |
|
132 g_log_set_always_fatal (fatal_mask); |
|
133 |
|
134 root = G_TYPE_OBJECT; |
|
135 |
|
136 g_type_init (); |
|
137 |
|
138 for (i = 1; i < argc; i++) |
|
139 { |
|
140 if (strcmp ("-s", argv[i]) == 0) |
|
141 { |
|
142 i++; |
|
143 if (i < argc) |
|
144 spacing = atoi (argv[i]); |
|
145 } |
|
146 else if (strcmp ("-i", argv[i]) == 0) |
|
147 { |
|
148 i++; |
|
149 if (i < argc) |
|
150 { |
|
151 char *p; |
|
152 guint n; |
|
153 |
|
154 p = argv[i]; |
|
155 while (*p) |
|
156 p++; |
|
157 n = p - argv[i]; |
|
158 indent_inc = g_new (gchar, n * strlen (O_SPACE) + 1); |
|
159 *indent_inc = 0; |
|
160 while (n) |
|
161 { |
|
162 n--; |
|
163 strcpy (indent_inc, O_SPACE); |
|
164 } |
|
165 } |
|
166 } |
|
167 else if (strcmp ("-b", argv[i]) == 0) |
|
168 { |
|
169 i++; |
|
170 if (i < argc) |
|
171 iindent = argv[i]; |
|
172 } |
|
173 else if (strcmp ("-r", argv[i]) == 0) |
|
174 { |
|
175 i++; |
|
176 if (i < argc) |
|
177 root = g_type_from_name (argv[i]); |
|
178 } |
|
179 else if (strcmp ("-n", argv[i]) == 0) |
|
180 { |
|
181 recursion = FALSE; |
|
182 } |
|
183 else if (strcmp ("froots", argv[i]) == 0) |
|
184 { |
|
185 gen_froots = 1; |
|
186 } |
|
187 else if (strcmp ("tree", argv[i]) == 0) |
|
188 { |
|
189 gen_tree = 1; |
|
190 } |
|
191 else if (strcmp ("-h", argv[i]) == 0) |
|
192 { |
|
193 return help (NULL); |
|
194 } |
|
195 else if (strcmp ("--help", argv[i]) == 0) |
|
196 { |
|
197 return help (NULL); |
|
198 } |
|
199 else |
|
200 return help (argv[i]); |
|
201 } |
|
202 |
|
203 if (!gen_froots && !gen_tree) |
|
204 return help (argv[i-1]); |
|
205 |
|
206 if (!indent_inc) |
|
207 { |
|
208 indent_inc = g_new (gchar, strlen (O_SPACE) + 1); |
|
209 *indent_inc = 0; |
|
210 strcpy (indent_inc, O_SPACE); |
|
211 } |
|
212 |
|
213 if (gen_tree) |
|
214 show_nodes (root, 0, iindent); |
|
215 if (gen_froots) |
|
216 { |
|
217 root = ~0; |
|
218 for (i = 0; i <= G_TYPE_FUNDAMENTAL_MAX; i += G_TYPE_MAKE_FUNDAMENTAL (1)) |
|
219 { |
|
220 const gchar *name = g_type_name (i); |
|
221 |
|
222 if (name) |
|
223 show_nodes (i, 0, iindent); |
|
224 } |
|
225 } |
|
226 |
|
227 return 0; |
|
228 } |