Bug Summary

File:docs/reference/cafe-desktop/cafe-desktop-scan.c
Warning:line 188, column 16
Although the value stored to 'event_num' is used in the enclosing expression, the value is never actually read from 'event_num'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name cafe-desktop-scan.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/docs/reference/cafe-desktop -fcoverage-compilation-dir=/rootdir/docs/reference/cafe-desktop -resource-dir /usr/lib/llvm-19/lib/clang/19 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/startup-notification-1.0 -I ../../../libcafe-desktop -D CAFE_DESKTOP_USE_UNSTABLE_API -D PIC -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-12-27-181026-15074-1 -x c cafe-desktop-scan.c
1
2#include <string.h>
3#include <stdlib.h>
4#include <stdio.h>
5#include <errno(*__errno_location ()).h>
6#include <glib-object.h>
7
8#ifndef G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push clang diagnostic ignored "-Wdeprecated-declarations"
9# define G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push clang diagnostic ignored "-Wdeprecated-declarations"
10# define G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop
11#endif
12
13#include <cafe-desktop-item.h>
14#include <cafe-bg.h>
15#include <cafe-desktop-thumbnail.h>
16#include <cafe-rr-labeler.h>
17
18
19#ifdef GTK_IS_WIDGET_CLASS
20#include <gtk/gtk.h>
21#endif
22static GType object_types[5];
23
24static GType *
25get_object_types (void)
26{
27 gpointer g_object_class;
28 gint i = 0;
29
30G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push clang diagnostic ignored "-Wdeprecated-declarations"
31
32 object_types[i++] = cafe_desktop_item_get_type ();
33 object_types[i++] = cafe_bg_get_type ();
34 object_types[i++] = cafe_desktop_thumbnail_factory_get_type ();
35 object_types[i++] = cafe_rr_labeler_get_type ();
36
37 object_types[i] = G_TYPE_INVALID((GType) ((0) << (2)));
38
39 /* reference the GObjectClass to initialize the param spec pool
40 * potentially needed by interfaces. See http://bugs.gnome.org/571820 */
41 g_object_class = g_type_class_ref (G_TYPE_OBJECT((GType) ((20) << (2))));
42
43 /* Need to make sure all the types are loaded in and initialize
44 * their signals and properties.
45 */
46 for (i=0; object_types[i]; i++) {
47 if (G_TYPE_IS_CLASSED (object_types[i])(g_type_test_flags ((object_types[i]), G_TYPE_FLAG_CLASSED)))
48 g_type_class_ref (object_types[i]);
49 if (G_TYPE_IS_INTERFACE (object_types[i])((g_type_fundamental (object_types[i])) == ((GType) ((2) <<
(2))))
)
50 g_type_default_interface_ref (object_types[i]);
51 }
52
53 g_type_class_unref (g_object_class);
54
55G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop
56
57 return object_types;
58}
59
60/*
61 * This uses GObject type functions to output signal prototypes and the object
62 * hierarchy.
63 */
64
65/* The output files */
66const gchar *signals_filename = "./cafe-desktop.signals.new";
67const gchar *hierarchy_filename = "./cafe-desktop.hierarchy.new";
68const gchar *interfaces_filename = "./cafe-desktop.interfaces.new";
69const gchar *prerequisites_filename = "./cafe-desktop.prerequisites.new";
70const gchar *args_filename = "./cafe-desktop.args.new";
71const gchar *actions_filename = "./cafe-desktop.actions.new";
72
73static void output_signals (void);
74static void output_object_signals (FILE *fp,
75 GType object_type);
76static void output_object_signal (FILE *fp,
77 const gchar *object_class_name,
78 guint signal_id);
79static const gchar * get_type_name (GType type,
80 gboolean * is_pointer);
81static void output_object_hierarchy (void);
82static void output_hierarchy (FILE *fp,
83 GType type,
84 guint level);
85
86static void output_object_interfaces (void);
87static void output_interfaces (FILE *fp,
88 GType type);
89
90static void output_interface_prerequisites (void);
91static void output_prerequisites (FILE *fp,
92 GType type);
93
94static void output_args (void);
95static void output_object_args (FILE *fp, GType object_type);
96
97static void output_actions (void);
98static void output_object_actions (FILE *fp, GType object_type);
99
100int
101main (void)
102{
103 ;
104
105 get_object_types ();
106
107 output_signals ();
108 output_object_hierarchy ();
109 output_object_interfaces ();
110 output_interface_prerequisites ();
111 output_args ();
112 output_actions ();
113
114 return 0;
115}
116
117static void
118output_signals (void)
119{
120 FILE *fp;
121 gint i;
122
123 fp = fopen (signals_filename, "w");
124 if (fp == NULL((void*)0)) {
125 g_warning ("Couldn't open output file: %s : %s", signals_filename, g_strerror(errno(*__errno_location ())));
126 return;
127 }
128
129 for (i = 0; object_types[i]; i++)
130 output_object_signals (fp, object_types[i]);
131
132 fclose (fp);
133}
134
135static gint
136compare_signals (const void *a, const void *b)
137{
138 const guint *signal_a = a;
139 const guint *signal_b = b;
140
141 return strcmp (g_signal_name (*signal_a), g_signal_name (*signal_b));
142}
143
144/* This outputs all the signals of one object. */
145static void
146output_object_signals (FILE *fp, GType object_type)
147{
148 const gchar *object_class_name;
149 guint *signals, n_signals;
150 guint sig;
151
152 if (G_TYPE_IS_INSTANTIATABLE (object_type)(g_type_test_flags ((object_type), G_TYPE_FLAG_INSTANTIATABLE
))
||
153 G_TYPE_IS_INTERFACE (object_type)((g_type_fundamental (object_type)) == ((GType) ((2) <<
(2))))
) {
154
155 object_class_name = g_type_name (object_type);
156
157 signals = g_signal_list_ids (object_type, &n_signals);
158 if (n_signals > 0)
159 qsort (signals, n_signals, sizeof (guint), compare_signals);
160
161 for (sig = 0; sig < n_signals; sig++) {
162 output_object_signal (fp, object_class_name, signals[sig]);
163 }
164 g_free (signals);
165 }
166}
167
168/* This outputs one signal. */
169static void
170output_object_signal (FILE *fp,
171 const gchar *object_name,
172 guint signal_id)
173{
174 GSignalQuery query_info;
175 const gchar *type_name, *ret_type, *object_arg, *arg_name;
176 gchar *pos, *object_arg_lower;
177 gboolean is_pointer;
178 gchar buffer[1024];
179 guint i, param;
180 gint param_num, widget_num, event_num, callback_num;
181 gint *arg_num;
182 gchar signal_name[128];
183 gchar flags[16];
184
185 /* g_print ("Object: %s Signal: %u\n", object_name, signal_id);*/
186
187 param_num = 1;
188 widget_num = event_num = callback_num = 0;
Although the value stored to 'event_num' is used in the enclosing expression, the value is never actually read from 'event_num'
189
190 g_signal_query (signal_id, &query_info);
191
192 /* Output the signal object type and the argument name. We assume the
193 * type is a pointer - I think that is OK. We remove "Gtk" or "Gnome" and
194 * convert to lower case for the argument name. */
195 pos = buffer;
196 sprintf (pos, "%s ", object_name);
197 pos += strlen (pos);
198
199 /* Try to come up with a sensible variable name for the first arg
200 * It chops off 2 know prefixes :/ and makes the name lowercase
201 * It should replace lowercase -> uppercase with '_'
202 * GFileMonitor -> file_monitor
203 * GIOExtensionPoint -> extension_point
204 * GtkTreeView -> tree_view
205 * if 2nd char is upper case too
206 * search for first lower case and go back one char
207 * else
208 * search for next upper case
209 */
210 if (!strncmp (object_name, "Gtk", 3))
211 object_arg = object_name + 3;
212 else if (!strncmp (object_name, "Gnome", 5))
213 object_arg = object_name + 5;
214 else
215 object_arg = object_name;
216
217 object_arg_lower = g_ascii_strdown (object_arg, -1);
218 sprintf (pos, "*%s\n", object_arg_lower);
219 pos += strlen (pos);
220 if (!strncmp (object_arg_lower, "widget", 6))
221 widget_num = 2;
222 g_free(object_arg_lower);
223
224 /* Convert signal name to use underscores rather than dashes '-'. */
225 strncpy (signal_name, query_info.signal_name, 127);
226 signal_name[127] = '\0';
227 for (i = 0; signal_name[i]; i++) {
228 if (signal_name[i] == '-')
229 signal_name[i] = '_';
230 }
231
232 /* Output the signal parameters. */
233 for (param = 0; param < query_info.n_params; param++) {
234 type_name = get_type_name (query_info.param_types[param] & ~G_SIGNAL_TYPE_STATIC_SCOPE(((GType) (1 << 0))), &is_pointer);
235
236 /* Most arguments to the callback are called "arg1", "arg2", etc.
237 GtkWidgets are called "widget", "widget2", ...
238 GtkCallbacks are called "callback", "callback2", ... */
239 if (!strcmp (type_name, "GtkWidget")) {
240 arg_name = "widget";
241 arg_num = &widget_num;
242 }
243 else if (!strcmp (type_name, "GtkCallback")
244 || !strcmp (type_name, "GtkCCallback")) {
245 arg_name = "callback";
246 arg_num = &callback_num;
247 }
248 else {
249 arg_name = "arg";
250 arg_num = &param_num;
251 }
252 sprintf (pos, "%s ", type_name);
253 pos += strlen (pos);
254
255 if (!arg_num || *arg_num == 0)
256 sprintf (pos, "%s%s\n", is_pointer ? "*" : " ", arg_name);
257 else
258 sprintf (pos, "%s%s%i\n", is_pointer ? "*" : " ", arg_name,
259 *arg_num);
260 pos += strlen (pos);
261
262 if (arg_num) {
263 if (*arg_num == 0)
264 *arg_num = 2;
265 else
266 *arg_num += 1;
267 }
268 }
269
270 pos = flags;
271 /* We use one-character flags for simplicity. */
272 if (query_info.signal_flags & G_SIGNAL_RUN_FIRST)
273 *pos++ = 'f';
274 if (query_info.signal_flags & G_SIGNAL_RUN_LAST)
275 *pos++ = 'l';
276 if (query_info.signal_flags & G_SIGNAL_RUN_CLEANUP)
277 *pos++ = 'c';
278 if (query_info.signal_flags & G_SIGNAL_NO_RECURSE)
279 *pos++ = 'r';
280 if (query_info.signal_flags & G_SIGNAL_DETAILED)
281 *pos++ = 'd';
282 if (query_info.signal_flags & G_SIGNAL_ACTION)
283 *pos++ = 'a';
284 if (query_info.signal_flags & G_SIGNAL_NO_HOOKS)
285 *pos++ = 'h';
286 *pos = 0;
287
288 /* Output the return type and function name. */
289 ret_type = get_type_name (query_info.return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE(((GType) (1 << 0))), &is_pointer);
290
291 fprintf (fp,
292 "<SIGNAL>\n<NAME>%s::%s</NAME>\n<RETURNS>%s%s</RETURNS>\n<FLAGS>%s</FLAGS>\n%s</SIGNAL>\n\n",
293 object_name, query_info.signal_name, ret_type, is_pointer ? "*" : "", flags, buffer);
294}
295
296
297/* Returns the type name to use for a signal argument or return value, given
298 the GtkType from the signal info. It also sets is_pointer to TRUE if the
299 argument needs a '*' since it is a pointer. */
300static const gchar *
301get_type_name (GType type, gboolean * is_pointer)
302{
303 const gchar *type_name;
304
305 *is_pointer = FALSE(0);
306 type_name = g_type_name (type);
307
308 switch (type) {
309 case G_TYPE_NONE((GType) ((1) << (2))):
310 case G_TYPE_UCHAR((GType) ((4) << (2))):
311 case G_TYPE_BOOLEAN((GType) ((5) << (2))):
312 case G_TYPE_UINT((GType) ((7) << (2))):
313 case G_TYPE_LONG((GType) ((8) << (2))):
314 case G_TYPE_ULONG((GType) ((9) << (2))):
315 case G_TYPE_POINTER((GType) ((17) << (2))):
316 /* These all have normal C type names so they are OK. */
317 return type_name;
318
319 case G_TYPE_CHAR((GType) ((3) << (2))):
320 return "char";
321
322 case G_TYPE_INT((GType) ((6) << (2))):
323 return "int";
324
325 case G_TYPE_FLOAT((GType) ((14) << (2))):
326 return "float";
327
328 case G_TYPE_DOUBLE((GType) ((15) << (2))):
329 return "double";
330
331 case G_TYPE_STRING((GType) ((16) << (2))):
332 /* A GtkString is really a gchar*. */
333 *is_pointer = TRUE(!(0));
334 return "char";
335
336 case G_TYPE_ENUM((GType) ((12) << (2))):
337 case G_TYPE_FLAGS((GType) ((13) << (2))):
338 /* We use a gint for both of these. Hopefully a subtype with a decent
339 name will be registered and used instead, as GTK+ does itself. */
340 return "int";
341
342 case G_TYPE_BOXED((GType) ((18) << (2))):
343 /* The boxed type shouldn't be used itself, only subtypes. Though we
344 return 'gpointer' just in case. */
345 return "gpointer";
346
347 case G_TYPE_PARAM((GType) ((19) << (2))):
348 /* A GParam is really a GParamSpec*. */
349 *is_pointer = TRUE(!(0));
350 return "GParamSpec";
351
352#if GLIB_CHECK_VERSION (2, 25, 9)(2 > (2) || (2 == (2) && 82 > (25)) || (2 == (2
) && 82 == (25) && 4 >= (9)))
353 case G_TYPE_VARIANT((GType) ((21) << (2))):
354 *is_pointer = TRUE(!(0));
355 return "GVariant";
356#endif
357
358default:
359 break;
360 }
361
362 /* For all GObject subclasses we can use the class name with a "*",
363 e.g. 'GtkWidget *'. */
364 if (g_type_is_a (type, G_TYPE_OBJECT)((type) == (((GType) ((20) << (2)))) || (g_type_is_a) (
(type), (((GType) ((20) << (2))))))
)
365 *is_pointer = TRUE(!(0));
366
367 /* Also catch non GObject root types */
368 if (G_TYPE_IS_CLASSED (type)(g_type_test_flags ((type), G_TYPE_FLAG_CLASSED)))
369 *is_pointer = TRUE(!(0));
370
371 /* All boxed subtypes will be pointers as well. */
372 /* Exception: GStrv */
373 if (g_type_is_a (type, G_TYPE_BOXED)((type) == (((GType) ((18) << (2)))) || (g_type_is_a) (
(type), (((GType) ((18) << (2))))))
&&
374 !g_type_is_a (type, G_TYPE_STRV)((type) == ((g_strv_get_type ())) || (g_type_is_a) ((type), (
(g_strv_get_type ()))))
)
375 *is_pointer = TRUE(!(0));
376
377 /* All pointer subtypes will be pointers as well. */
378 if (g_type_is_a (type, G_TYPE_POINTER)((type) == (((GType) ((17) << (2)))) || (g_type_is_a) (
(type), (((GType) ((17) << (2))))))
)
379 *is_pointer = TRUE(!(0));
380
381 /* But enums are not */
382 if (g_type_is_a (type, G_TYPE_ENUM)((type) == (((GType) ((12) << (2)))) || (g_type_is_a) (
(type), (((GType) ((12) << (2))))))
||
383 g_type_is_a (type, G_TYPE_FLAGS)((type) == (((GType) ((13) << (2)))) || (g_type_is_a) (
(type), (((GType) ((13) << (2))))))
)
384 *is_pointer = FALSE(0);
385
386 return type_name;
387}
388
389
390/* This outputs the hierarchy of all objects which have been initialized,
391 i.e. by calling their XXX_get_type() initialization function. */
392static void
393output_object_hierarchy (void)
394{
395 FILE *fp;
396 gint i,j;
397 GType root, type;
398 GType root_types[5] = { G_TYPE_INVALID((GType) ((0) << (2))), };
399
400 fp = fopen (hierarchy_filename, "w");
401 if (fp == NULL((void*)0)) {
402 g_warning ("Couldn't open output file: %s : %s", hierarchy_filename, g_strerror(errno(*__errno_location ())));
403 return;
404 }
405 output_hierarchy (fp, G_TYPE_OBJECT((GType) ((20) << (2))), 0);
406 output_hierarchy (fp, G_TYPE_INTERFACE((GType) ((2) << (2))), 0);
407
408 for (i=0; object_types[i]; i++) {
409 root = object_types[i];
410 while ((type = g_type_parent (root))) {
411 root = type;
412 }
413 if ((root != G_TYPE_OBJECT((GType) ((20) << (2)))) && (root != G_TYPE_INTERFACE((GType) ((2) << (2))))) {
414 for (j=0; root_types[j]; j++) {
415 if (root == root_types[j]) {
416 root = G_TYPE_INVALID((GType) ((0) << (2))); break;
417 }
418 }
419 if(root) {
420 root_types[j] = root;
421 output_hierarchy (fp, root, 0);
422 }
423 }
424 }
425
426 fclose (fp);
427}
428
429/* This is called recursively to output the hierarchy of a object. */
430static void
431output_hierarchy (FILE *fp,
432 GType type,
433 guint level)
434{
435 guint i;
436 GType *children;
437 guint n_children;
438
439 if (!type)
440 return;
441
442 for (i = 0; i < level; i++)
443 fprintf (fp, " ");
444 fprintf (fp, "%s\n", g_type_name (type));
445
446 children = g_type_children (type, &n_children);
447
448 for (i=0; i < n_children; i++)
449 output_hierarchy (fp, children[i], level + 1);
450
451 g_free (children);
452}
453
454static void output_object_interfaces (void)
455{
456 guint i;
457 FILE *fp;
458
459 fp = fopen (interfaces_filename, "w");
460 if (fp == NULL((void*)0)) {
461 g_warning ("Couldn't open output file: %s : %s", interfaces_filename, g_strerror(errno(*__errno_location ())));
462 return;
463 }
464 output_interfaces (fp, G_TYPE_OBJECT((GType) ((20) << (2))));
465
466 for (i = 0; object_types[i]; i++) {
467 if (!g_type_parent (object_types[i]) &&
468 (object_types[i] != G_TYPE_OBJECT((GType) ((20) << (2)))) &&
469 G_TYPE_IS_INSTANTIATABLE (object_types[i])(g_type_test_flags ((object_types[i]), G_TYPE_FLAG_INSTANTIATABLE
))
) {
470 output_interfaces (fp, object_types[i]);
471 }
472 }
473 fclose (fp);
474}
475
476static void
477output_interfaces (FILE *fp,
478 GType type)
479{
480 guint i;
481 GType *children, *interfaces;
482 guint n_children, n_interfaces;
483
484 if (!type)
485 return;
486
487 interfaces = g_type_interfaces (type, &n_interfaces);
488
489 if (n_interfaces > 0) {
490 fprintf (fp, "%s", g_type_name (type));
491 for (i=0; i < n_interfaces; i++)
492 fprintf (fp, " %s", g_type_name (interfaces[i]));
493 fprintf (fp, "\n");
494 }
495 g_free (interfaces);
496
497 children = g_type_children (type, &n_children);
498
499 for (i=0; i < n_children; i++)
500 output_interfaces (fp, children[i]);
501
502 g_free (children);
503}
504
505static void output_interface_prerequisites (void)
506{
507 FILE *fp;
508
509 fp = fopen (prerequisites_filename, "w");
510 if (fp == NULL((void*)0)) {
511 g_warning ("Couldn't open output file: %s : %s", prerequisites_filename, g_strerror(errno(*__errno_location ())));
512 return;
513 }
514 output_prerequisites (fp, G_TYPE_INTERFACE((GType) ((2) << (2))));
515 fclose (fp);
516}
517
518static void
519output_prerequisites (FILE *fp,
520 GType type)
521{
522#if GLIB_CHECK_VERSION(2,1,0)(2 > (2) || (2 == (2) && 82 > (1)) || (2 == (2)
&& 82 == (1) && 4 >= (0)))
523 guint i;
524 GType *children, *prerequisites;
525 guint n_children, n_prerequisites;
526
527 if (!type)
528 return;
529
530 prerequisites = g_type_interface_prerequisites (type, &n_prerequisites);
531
532 if (n_prerequisites > 0) {
533 fprintf (fp, "%s", g_type_name (type));
534 for (i=0; i < n_prerequisites; i++)
535 fprintf (fp, " %s", g_type_name (prerequisites[i]));
536 fprintf (fp, "\n");
537 }
538 g_free (prerequisites);
539
540 children = g_type_children (type, &n_children);
541
542 for (i=0; i < n_children; i++)
543 output_prerequisites (fp, children[i]);
544
545 g_free (children);
546#endif
547}
548
549static void
550output_actions (void)
551{
552 FILE *fp;
553 gint i;
554
555 fp = fopen (actions_filename, "w");
556 if (fp == NULL((void*)0)) {
557 g_warning ("Couldn't open output file: %s : %s", actions_filename, g_strerror(errno(*__errno_location ())));
558 return;
559 }
560
561 for (i = 0; object_types[i]; i++) {
562 output_object_actions (fp, object_types[i]);
563 }
564
565 fclose (fp);
566}
567
568static void
569output_object_actions (FILE *fp, GType object_type)
570{
571 gpointer class;
572
573 if (!G_TYPE_IS_OBJECT (object_type)((g_type_fundamental (object_type)) == ((GType) ((20) <<
(2))))
)
574 return;
575
576 class = g_type_class_peek (object_type);
577 if (!class)
578 return;
579
580#ifdef GTK_IS_WIDGET_CLASS
581#if GTK_CHECK_VERSION(3,96,0)
582 if (GTK_IS_WIDGET_CLASS (class)) {
583 guint i = 0;
584 const char *action_name;
585 GType owner;
586 const GVariantType *parameter_type;
587 const char *property_name;
588 const gchar *object_class_name;
589
590 object_class_name = g_type_name (object_type);
591 while (gtk_widget_class_query_action (GTK_WIDGET_CLASS (class),
592 i,
593 &owner,
594 &action_name,
595 &parameter_type,
596 &property_name)) {
597 i++;
598 if (owner == G_TYPE_FROM_CLASS (class)(((GTypeClass*) (class))->g_type))
599 fprintf (fp, "<ACTION>\n"
600 "<NAME>%s:::%s</NAME>\n"
601 "<PARAMETER>%s</PARAMETER>\n"
602 "<PROPERTY>%s</PROPERTY>\n"
603 "</ACTION>\n\n",
604 object_class_name,
605 action_name,
606 parameter_type ? g_variant_type_peek_string (parameter_type) : "",
607 property_name ? property_name : "");
608 }
609 }
610#endif
611#endif
612}
613
614static void
615output_args (void)
616{
617 FILE *fp;
618 gint i;
619
620 fp = fopen (args_filename, "w");
621 if (fp == NULL((void*)0)) {
622 g_warning ("Couldn't open output file: %s : %s", args_filename, g_strerror(errno(*__errno_location ())));
623 return;
624 }
625
626 for (i = 0; object_types[i]; i++) {
627 output_object_args (fp, object_types[i]);
628 }
629
630 fclose (fp);
631}
632
633static gint
634compare_param_specs (const void *a, const void *b)
635{
636 GParamSpec *spec_a = *(GParamSpec **)a;
637 GParamSpec *spec_b = *(GParamSpec **)b;
638
639 return strcmp (g_param_spec_get_name (spec_a), g_param_spec_get_name (spec_b));
640}
641
642/* Its common to have unsigned properties restricted
643 * to the signed range. Therefore we make this look
644 * a bit nicer by spelling out the max constants.
645 */
646
647/* Don't use "==" with floats, it might trigger a gcc warning. */
648#define GTKDOC_COMPARE_FLOAT(x, y)(x <= y && x >= y) (x <= y && x >= y)
649
650static gchar*
651describe_double_constant (gdouble value)
652{
653 gchar *desc;
654
655 if (GTKDOC_COMPARE_FLOAT (value, G_MAXDOUBLE)(value <= 1.7976931348623157e+308 && value >= 1.7976931348623157e+308
)
)
656 desc = g_strdup ("G_MAXDOUBLE")g_strdup_inline ("G_MAXDOUBLE");
657 else if (GTKDOC_COMPARE_FLOAT (value, G_MINDOUBLE)(value <= 2.2250738585072014e-308 && value >= 2.2250738585072014e-308
)
)
658 desc = g_strdup ("G_MINDOUBLE")g_strdup_inline ("G_MINDOUBLE");
659 else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXDOUBLE)(value <= -1.7976931348623157e+308 && value >= -
1.7976931348623157e+308)
)
660 desc = g_strdup ("-G_MAXDOUBLE")g_strdup_inline ("-G_MAXDOUBLE");
661 else if (GTKDOC_COMPARE_FLOAT (value, (gdouble)G_MAXFLOAT)(value <= (gdouble)3.40282347e+38F && value >= (
gdouble)3.40282347e+38F)
)
662 desc = g_strdup ("G_MAXFLOAT")g_strdup_inline ("G_MAXFLOAT");
663 else if (GTKDOC_COMPARE_FLOAT (value, (gdouble)G_MINFLOAT)(value <= (gdouble)1.17549435e-38F && value >= (
gdouble)1.17549435e-38F)
)
664 desc = g_strdup ("G_MINFLOAT")g_strdup_inline ("G_MINFLOAT");
665 else if (GTKDOC_COMPARE_FLOAT (value, (gdouble)-G_MAXFLOAT)(value <= (gdouble)-3.40282347e+38F && value >=
(gdouble)-3.40282347e+38F)
)
666 desc = g_strdup ("-G_MAXFLOAT")g_strdup_inline ("-G_MAXFLOAT");
667 else{
668 /* make sure floats are output with a decimal dot irrespective of
669 * current locale. Use formatd since we want human-readable numbers
670 * and do not need the exact same bit representation when deserialising */
671 desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE(29 + 10));
672 g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE(29 + 10), "%g", value);
673 }
674
675 return desc;
676}
677
678static gchar*
679describe_signed_constant (gsize size, gint64 value)
680{
681 gchar *desc = NULL((void*)0);
682
683 switch (size) {
684 case 2:
685 if (sizeof (int) == 2) {
686 if (value == G_MAXINT2147483647)
687 desc = g_strdup ("G_MAXINT")g_strdup_inline ("G_MAXINT");
688 else if (value == G_MININT(-2147483647 -1))
689 desc = g_strdup ("G_MININT")g_strdup_inline ("G_MININT");
690 }
691 break;
692 case 4:
693 if (sizeof (int) == 4) {
694 if (value == G_MAXINT2147483647)
695 desc = g_strdup ("G_MAXINT")g_strdup_inline ("G_MAXINT");
696 else if (value == G_MININT(-2147483647 -1))
697 desc = g_strdup ("G_MININT")g_strdup_inline ("G_MININT");
698 }
699 if (value == G_MAXLONG9223372036854775807L)
700 desc = g_strdup ("G_MAXLONG")g_strdup_inline ("G_MAXLONG");
701 else if (value == G_MINLONG(-9223372036854775807L -1L))
702 desc = g_strdup ("G_MINLONG")g_strdup_inline ("G_MINLONG");
703 break;
704 case 8:
705 if (value == G_MAXINT64(0x7fffffffffffffffL))
706 desc = g_strdup ("G_MAXINT64")g_strdup_inline ("G_MAXINT64");
707 else if (value == G_MININT64((gint64) (-(0x7fffffffffffffffL) - (1L))))
708 desc = g_strdup ("G_MININT64")g_strdup_inline ("G_MININT64");
709 break;
710 default:
711 break;
712 }
713 if (!desc)
714 desc = g_strdup_printf ("%" G_GINT64_FORMAT"li", value);
715
716 return desc;
717}
718
719static gchar*
720describe_unsigned_constant (gsize size, guint64 value)
721{
722 gchar *desc = NULL((void*)0);
723
724 switch (size) {
725 case 2:
726 if (sizeof (int) == 2) {
727 if (value == (guint64)G_MAXINT2147483647)
728 desc = g_strdup ("G_MAXINT")g_strdup_inline ("G_MAXINT");
729 else if (value == G_MAXUINT(2147483647 *2U +1U))
730 desc = g_strdup ("G_MAXUINT")g_strdup_inline ("G_MAXUINT");
731 }
732 break;
733 case 4:
734 if (sizeof (int) == 4) {
735 if (value == (guint64)G_MAXINT2147483647)
736 desc = g_strdup ("G_MAXINT")g_strdup_inline ("G_MAXINT");
737 else if (value == G_MAXUINT(2147483647 *2U +1U))
738 desc = g_strdup ("G_MAXUINT")g_strdup_inline ("G_MAXUINT");
739 }
740 if (desc == NULL((void*)0)) {
741 if (value == (guint64)G_MAXLONG9223372036854775807L)
742 desc = g_strdup ("G_MAXLONG")g_strdup_inline ("G_MAXLONG");
743 else if (value == G_MAXULONG(9223372036854775807L *2UL+1UL))
744 desc = g_strdup ("G_MAXULONG")g_strdup_inline ("G_MAXULONG");
745 }
746 break;
747 case 8:
748 if (value == G_MAXINT64(0x7fffffffffffffffL))
749 desc = g_strdup ("G_MAXINT64")g_strdup_inline ("G_MAXINT64");
750 else if (value == G_MAXUINT64(0xffffffffffffffffUL))
751 desc = g_strdup ("G_MAXUINT64")g_strdup_inline ("G_MAXUINT64");
752 break;
753 default:
754 break;
755 }
756 if (!desc)
757 desc = g_strdup_printf ("%" G_GUINT64_FORMAT"lu", value);
758
759 return desc;
760}
761
762static gchar*
763describe_type (GParamSpec *spec)
764{
765 gchar *desc;
766 gchar *lower;
767 gchar *upper;
768
769 if (G_IS_PARAM_SPEC_CHAR (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[0])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
770 GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec)((((GParamSpecChar*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[0]))))))
;
771
772 lower = describe_signed_constant (sizeof(gchar), pspec->minimum);
773 upper = describe_signed_constant (sizeof(gchar), pspec->maximum);
774 if (pspec->minimum == G_MININT8((gint8) (-((gint8) 0x7f) - 1)) && pspec->maximum == G_MAXINT8((gint8) 0x7f))
775 desc = g_strdup ("")g_strdup_inline ("");
776 else if (pspec->minimum == G_MININT8((gint8) (-((gint8) 0x7f) - 1)))
777 desc = g_strdup_printf ("<= %s", upper);
778 else if (pspec->maximum == G_MAXINT8((gint8) 0x7f))
779 desc = g_strdup_printf (">= %s", lower);
780 else
781 desc = g_strdup_printf ("[%s,%s]", lower, upper);
782 g_free (lower);
783 g_free (upper);
784 }
785 else if (G_IS_PARAM_SPEC_UCHAR (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[1])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
786 GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec)((((GParamSpecUChar*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[1]))))))
;
787
788 lower = describe_unsigned_constant (sizeof(guchar), pspec->minimum);
789 upper = describe_unsigned_constant (sizeof(guchar), pspec->maximum);
790 if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT8((guint8) 0xff))
791 desc = g_strdup ("")g_strdup_inline ("");
792 else if (pspec->minimum == 0)
793 desc = g_strdup_printf ("<= %s", upper);
794 else if (pspec->maximum == G_MAXUINT8((guint8) 0xff))
795 desc = g_strdup_printf (">= %s", lower);
796 else
797 desc = g_strdup_printf ("[%s,%s]", lower, upper);
798 g_free (lower);
799 g_free (upper);
800 }
801 else if (G_IS_PARAM_SPEC_INT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[3])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
802 GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec)((((GParamSpecInt*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[3]))))))
;
803
804 lower = describe_signed_constant (sizeof(gint), pspec->minimum);
805 upper = describe_signed_constant (sizeof(gint), pspec->maximum);
806 if (pspec->minimum == G_MININT(-2147483647 -1) && pspec->maximum == G_MAXINT2147483647)
807 desc = g_strdup ("")g_strdup_inline ("");
808 else if (pspec->minimum == G_MININT(-2147483647 -1))
809 desc = g_strdup_printf ("<= %s", upper);
810 else if (pspec->maximum == G_MAXINT2147483647)
811 desc = g_strdup_printf (">= %s", lower);
812 else
813 desc = g_strdup_printf ("[%s,%s]", lower, upper);
814 g_free (lower);
815 g_free (upper);
816 }
817 else if (G_IS_PARAM_SPEC_UINT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[4])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
818 GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec)((((GParamSpecUInt*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[4]))))))
;
819
820 lower = describe_unsigned_constant (sizeof(guint), pspec->minimum);
821 upper = describe_unsigned_constant (sizeof(guint), pspec->maximum);
822 if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT(2147483647 *2U +1U))
823 desc = g_strdup ("")g_strdup_inline ("");
824 else if (pspec->minimum == 0)
825 desc = g_strdup_printf ("<= %s", upper);
826 else if (pspec->maximum == G_MAXUINT(2147483647 *2U +1U))
827 desc = g_strdup_printf (">= %s", lower);
828 else
829 desc = g_strdup_printf ("[%s,%s]", lower, upper);
830 g_free (lower);
831 g_free (upper);
832 }
833 else if (G_IS_PARAM_SPEC_LONG (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[5])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
834 GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec)((((GParamSpecLong*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[5]))))))
;
835
836 lower = describe_signed_constant (sizeof(glong), pspec->minimum);
837 upper = describe_signed_constant (sizeof(glong), pspec->maximum);
838 if (pspec->minimum == G_MINLONG(-9223372036854775807L -1L) && pspec->maximum == G_MAXLONG9223372036854775807L)
839 desc = g_strdup ("")g_strdup_inline ("");
840 else if (pspec->minimum == G_MINLONG(-9223372036854775807L -1L))
841 desc = g_strdup_printf ("<= %s", upper);
842 else if (pspec->maximum == G_MAXLONG9223372036854775807L)
843 desc = g_strdup_printf (">= %s", lower);
844 else
845 desc = g_strdup_printf ("[%s,%s]", lower, upper);
846 g_free (lower);
847 g_free (upper);
848 }
849 else if (G_IS_PARAM_SPEC_ULONG (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[6])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
850 GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec)((((GParamSpecULong*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[6]))))))
;
851
852 lower = describe_unsigned_constant (sizeof(gulong), pspec->minimum);
853 upper = describe_unsigned_constant (sizeof(gulong), pspec->maximum);
854 if (pspec->minimum == 0 && pspec->maximum == G_MAXULONG(9223372036854775807L *2UL+1UL))
855 desc = g_strdup ("")g_strdup_inline ("");
856 else if (pspec->minimum == 0)
857 desc = g_strdup_printf ("<= %s", upper);
858 else if (pspec->maximum == G_MAXULONG(9223372036854775807L *2UL+1UL))
859 desc = g_strdup_printf (">= %s", lower);
860 else
861 desc = g_strdup_printf ("[%s,%s]", lower, upper);
862 g_free (lower);
863 g_free (upper);
864 }
865 else if (G_IS_PARAM_SPEC_INT64 (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[7])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
866 GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec)((((GParamSpecInt64*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[7]))))))
;
867
868 lower = describe_signed_constant (sizeof(gint64), pspec->minimum);
869 upper = describe_signed_constant (sizeof(gint64), pspec->maximum);
870 if (pspec->minimum == G_MININT64((gint64) (-(0x7fffffffffffffffL) - (1L))) && pspec->maximum == G_MAXINT64(0x7fffffffffffffffL))
871 desc = g_strdup ("")g_strdup_inline ("");
872 else if (pspec->minimum == G_MININT64((gint64) (-(0x7fffffffffffffffL) - (1L))))
873 desc = g_strdup_printf ("<= %s", upper);
874 else if (pspec->maximum == G_MAXINT64(0x7fffffffffffffffL))
875 desc = g_strdup_printf (">= %s", lower);
876 else
877 desc = g_strdup_printf ("[%s,%s]", lower, upper);
878 g_free (lower);
879 g_free (upper);
880 }
881 else if (G_IS_PARAM_SPEC_UINT64 (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[8])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
882 GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec)((((GParamSpecUInt64*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((spec)), ((g_param_spec_types[8]))))))
;
883
884 lower = describe_unsigned_constant (sizeof(guint64), pspec->minimum);
885 upper = describe_unsigned_constant (sizeof(guint64), pspec->maximum);
886 if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT64(0xffffffffffffffffUL))
887 desc = g_strdup ("")g_strdup_inline ("");
888 else if (pspec->minimum == 0)
889 desc = g_strdup_printf ("<= %s", upper);
890 else if (pspec->maximum == G_MAXUINT64(0xffffffffffffffffUL))
891 desc = g_strdup_printf (">= %s", lower);
892 else
893 desc = g_strdup_printf ("[%s,%s]", lower, upper);
894 g_free (lower);
895 g_free (upper);
896 }
897 else if (G_IS_PARAM_SPEC_FLOAT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[12])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
898 GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec)((((GParamSpecFloat*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[12]))))))
;
899
900 lower = describe_double_constant (pspec->minimum);
901 upper = describe_double_constant (pspec->maximum);
902 if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXFLOAT)(pspec->minimum <= -3.40282347e+38F && pspec->
minimum >= -3.40282347e+38F)
) {
903 if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)(pspec->maximum <= 3.40282347e+38F && pspec->
maximum >= 3.40282347e+38F)
)
904 desc = g_strdup ("")g_strdup_inline ("");
905 else
906 desc = g_strdup_printf ("<= %s", upper);
907 }
908 else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)(pspec->maximum <= 3.40282347e+38F && pspec->
maximum >= 3.40282347e+38F)
)
909 desc = g_strdup_printf (">= %s", lower);
910 else
911 desc = g_strdup_printf ("[%s,%s]", lower, upper);
912 g_free (lower);
913 g_free (upper);
914 }
915 else if (G_IS_PARAM_SPEC_DOUBLE (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[13])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
916 GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec)((((GParamSpecDouble*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((spec)), ((g_param_spec_types[13]))))))
;
917
918 lower = describe_double_constant (pspec->minimum);
919 upper = describe_double_constant (pspec->maximum);
920 if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXDOUBLE)(pspec->minimum <= -1.7976931348623157e+308 && pspec
->minimum >= -1.7976931348623157e+308)
) {
921 if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)(pspec->maximum <= 1.7976931348623157e+308 && pspec
->maximum >= 1.7976931348623157e+308)
)
922 desc = g_strdup ("")g_strdup_inline ("");
923 else
924 desc = g_strdup_printf ("<= %s", upper);
925 }
926 else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)(pspec->maximum <= 1.7976931348623157e+308 && pspec
->maximum >= 1.7976931348623157e+308)
)
927 desc = g_strdup_printf (">= %s", lower);
928 else
929 desc = g_strdup_printf ("[%s,%s]", lower, upper);
930 g_free (lower);
931 g_free (upper);
932 }
933#if GLIB_CHECK_VERSION (2, 12, 0)(2 > (2) || (2 == (2) && 82 > (12)) || (2 == (2
) && 82 == (12) && 4 >= (0)))
934 else if (G_IS_PARAM_SPEC_GTYPE (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[21])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
935 GParamSpecGType *pspec = G_PARAM_SPEC_GTYPE (spec)((((GParamSpecGType*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[21]))))))
;
936 gboolean is_pointer;
937
938 desc = g_strdup (get_type_name (pspec->is_a_type, &is_pointer))g_strdup_inline (get_type_name (pspec->is_a_type, &is_pointer
))
;
939 }
940#endif
941#if GLIB_CHECK_VERSION (2, 25, 9)(2 > (2) || (2 == (2) && 82 > (25)) || (2 == (2
) && 82 == (25) && 4 >= (9)))
942 else if (G_IS_PARAM_SPEC_VARIANT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[22])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
943 GParamSpecVariant *pspec = G_PARAM_SPEC_VARIANT (spec)((((GParamSpecVariant*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((spec)), ((g_param_spec_types[22]))))))
;
944 gchar *variant_type;
945
946 variant_type = g_variant_type_dup_string (pspec->type);
947 desc = g_strdup_printf ("GVariant<%s>", variant_type);
948 g_free (variant_type);
949 }
950#endif
951 else {
952 desc = g_strdup ("")g_strdup_inline ("");
953 }
954
955 return desc;
956}
957
958static gchar*
959describe_default (GParamSpec *spec)
960{
961 gchar *desc;
962
963 if (G_IS_PARAM_SPEC_CHAR (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[0])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
964 GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec)((((GParamSpecChar*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[0]))))))
;
965
966 desc = g_strdup_printf ("%d", pspec->default_value);
967 }
968 else if (G_IS_PARAM_SPEC_UCHAR (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[1])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
969 GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec)((((GParamSpecUChar*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[1]))))))
;
970
971 desc = g_strdup_printf ("%u", pspec->default_value);
972 }
973 else if (G_IS_PARAM_SPEC_BOOLEAN (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[2])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
974 GParamSpecBoolean *pspec = G_PARAM_SPEC_BOOLEAN (spec)((((GParamSpecBoolean*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((spec)), ((g_param_spec_types[2]))))))
;
975
976 desc = g_strdup_printf ("%s", pspec->default_value ? "TRUE" : "FALSE");
977 }
978 else if (G_IS_PARAM_SPEC_INT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[3])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
979 GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec)((((GParamSpecInt*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[3]))))))
;
980
981 desc = g_strdup_printf ("%d", pspec->default_value);
982 }
983 else if (G_IS_PARAM_SPEC_UINT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[4])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
984 GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec)((((GParamSpecUInt*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[4]))))))
;
985
986 desc = g_strdup_printf ("%u", pspec->default_value);
987 }
988 else if (G_IS_PARAM_SPEC_LONG (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[5])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
989 GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec)((((GParamSpecLong*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[5]))))))
;
990
991 desc = g_strdup_printf ("%ld", pspec->default_value);
992 }
993 else if (G_IS_PARAM_SPEC_LONG (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[5])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
994 GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec)((((GParamSpecULong*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[6]))))))
;
995
996 desc = g_strdup_printf ("%lu", pspec->default_value);
997 }
998 else if (G_IS_PARAM_SPEC_INT64 (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[7])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
999 GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec)((((GParamSpecInt64*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[7]))))))
;
1000
1001 desc = g_strdup_printf ("%" G_GINT64_FORMAT"li", pspec->default_value);
1002 }
1003 else if (G_IS_PARAM_SPEC_UINT64 (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[8])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
)
1004 {
1005 GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec)((((GParamSpecUInt64*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((spec)), ((g_param_spec_types[8]))))))
;
1006
1007 desc = g_strdup_printf ("%" G_GUINT64_FORMAT"lu", pspec->default_value);
1008 }
1009 else if (G_IS_PARAM_SPEC_UNICHAR (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[9])); gboolean __r;
if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1010 GParamSpecUnichar *pspec = G_PARAM_SPEC_UNICHAR (spec)((((GParamSpecUnichar*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((spec)), ((g_param_spec_types[9]))))))
;
1011
1012 if (g_unichar_isprint (pspec->default_value))
1013 desc = g_strdup_printf ("'%c'", pspec->default_value);
1014 else
1015 desc = g_strdup_printf ("%u", pspec->default_value);
1016 }
1017 else if (G_IS_PARAM_SPEC_ENUM (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[10])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1018 GParamSpecEnum *pspec = G_PARAM_SPEC_ENUM (spec)((((GParamSpecEnum*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[10]))))))
;
1019
1020 GEnumValue *value = g_enum_get_value (pspec->enum_class, pspec->default_value);
1021 if (value)
1022 desc = g_strdup_printf ("%s", value->value_name);
1023 else
1024 desc = g_strdup_printf ("%d", pspec->default_value);
1025 }
1026 else if (G_IS_PARAM_SPEC_FLAGS (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[11])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1027 GParamSpecFlags *pspec = G_PARAM_SPEC_FLAGS (spec)((((GParamSpecFlags*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[11]))))))
;
1028 guint default_value;
1029 GString *acc;
1030
1031 default_value = pspec->default_value;
1032 acc = g_string_new ("");
1033
1034 while (default_value) {
1035 GFlagsValue *value = g_flags_get_first_value (pspec->flags_class, default_value);
1036
1037 if (!value)
1038 break;
1039
1040 if (acc->len > 0)
1041 g_string_append (acc, " | ")(__builtin_constant_p (" | ") ? __extension__ ({ const char *
const __val = (" | "); g_string_append_len_inline (acc, __val
, (__val != ((void*)0)) ? (gssize) strlen (((__val) + !(__val
))) : (gssize) -1); }) : g_string_append_len_inline (acc, " | "
, (gssize) -1))
;
1042 g_string_append (acc, value->value_name)(__builtin_constant_p (value->value_name) ? __extension__ (
{ const char * const __val = (value->value_name); g_string_append_len_inline
(acc, __val, (__val != ((void*)0)) ? (gssize) strlen (((__val
) + !(__val))) : (gssize) -1); }) : g_string_append_len_inline
(acc, value->value_name, (gssize) -1))
;
1043
1044 default_value &= ~value->value;
1045 }
1046
1047 if (default_value == 0)
1048 desc = g_string_free (acc, FALSE)(__builtin_constant_p ((0)) ? (((0)) ? (g_string_free) ((acc)
, ((0))) : g_string_free_and_steal (acc)) : (g_string_free) (
(acc), ((0))))
;
1049 else {
1050 desc = g_strdup_printf ("%d", pspec->default_value);
1051 g_string_free (acc, TRUE)(__builtin_constant_p ((!(0))) ? (((!(0))) ? (g_string_free) (
(acc), ((!(0)))) : g_string_free_and_steal (acc)) : (g_string_free
) ((acc), ((!(0)))))
;
1052 }
1053 }
1054 else if (G_IS_PARAM_SPEC_FLOAT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[12])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1055 GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec)((((GParamSpecFloat*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((spec)), ((g_param_spec_types[12]))))))
;
1056
1057 /* make sure floats are output with a decimal dot irrespective of
1058 * current locale. Use formatd since we want human-readable numbers
1059 * and do not need the exact same bit representation when deserialising */
1060 desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE(29 + 10));
1061 g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE(29 + 10), "%g",
1062 pspec->default_value);
1063 }
1064 else if (G_IS_PARAM_SPEC_DOUBLE (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[13])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1065 GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec)((((GParamSpecDouble*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((spec)), ((g_param_spec_types[13]))))))
;
1066
1067 /* make sure floats are output with a decimal dot irrespective of
1068 * current locale. Use formatd since we want human-readable numbers
1069 * and do not need the exact same bit representation when deserialising */
1070 desc = g_malloc0 (G_ASCII_DTOSTR_BUF_SIZE(29 + 10));
1071 g_ascii_formatd (desc, G_ASCII_DTOSTR_BUF_SIZE(29 + 10), "%g",
1072 pspec->default_value);
1073 }
1074 else if (G_IS_PARAM_SPEC_STRING (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[14])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1075 GParamSpecString *pspec = G_PARAM_SPEC_STRING (spec)((((GParamSpecString*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((spec)), ((g_param_spec_types[14]))))))
;
1076
1077 if (pspec->default_value) {
1078 gchar *esc = g_strescape (pspec->default_value, NULL((void*)0));
1079 desc = g_strdup_printf ("\"%s\"", esc);
1080 g_free (esc);
1081 }
1082 else
1083 desc = g_strdup_printf ("NULL");
1084 }
1085#if GLIB_CHECK_VERSION (2, 25, 9)(2 > (2) || (2 == (2) && 82 > (25)) || (2 == (2
) && 82 == (25) && 4 >= (9)))
1086 else if (G_IS_PARAM_SPEC_VARIANT (spec)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(spec)); GType __t = ((g_param_spec_types[22])); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
) {
1087 GParamSpecVariant *pspec = G_PARAM_SPEC_VARIANT (spec)((((GParamSpecVariant*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((spec)), ((g_param_spec_types[22]))))))
;
1088
1089 if (pspec->default_value)
1090 desc = g_variant_print (pspec->default_value, TRUE(!(0)));
1091 else
1092 desc = g_strdup ("NULL")g_strdup_inline ("NULL");
1093 }
1094#endif
1095 else {
1096 desc = g_strdup ("")g_strdup_inline ("");
1097 }
1098
1099 return desc;
1100}
1101
1102
1103static void
1104output_object_args (FILE *fp, GType object_type)
1105{
1106 gpointer class;
1107 const gchar *object_class_name;
1108 guint arg;
1109 gchar flags[16], *pos;
1110 GParamSpec **properties;
1111 guint n_properties;
1112 gboolean child_prop;
1113 gboolean style_prop;
1114 gboolean is_pointer;
1115 const gchar *type_name;
1116 gchar *type_desc;
1117 gchar *default_value;
1118
1119 if (G_TYPE_IS_OBJECT (object_type)((g_type_fundamental (object_type)) == ((GType) ((20) <<
(2))))
) {
1120 class = g_type_class_peek (object_type);
1121 if (!class)
1122 return;
1123
1124 properties = g_object_class_list_properties (class, &n_properties);
1125 }
1126#if GLIB_MAJOR_VERSION2 > 2 || (GLIB_MAJOR_VERSION2 == 2 && GLIB_MINOR_VERSION82 >= 3)
1127 else if (G_TYPE_IS_INTERFACE (object_type)((g_type_fundamental (object_type)) == ((GType) ((2) <<
(2))))
) {
1128 class = g_type_default_interface_ref (object_type);
1129
1130 if (!class)
1131 return;
1132
1133 properties = g_object_interface_list_properties (class, &n_properties);
1134 }
1135#endif
1136 else
1137 return;
1138
1139 object_class_name = g_type_name (object_type);
1140
1141 child_prop = FALSE(0);
1142 style_prop = FALSE(0);
1143
1144 while (TRUE(!(0))) {
1145 if (n_properties > 0)
1146 qsort (properties, n_properties, sizeof (GParamSpec *), compare_param_specs);
1147 for (arg = 0; arg < n_properties; arg++) {
1148 GParamSpec *spec = properties[arg];
1149 const gchar *nick, *blurb, *dot;
1150
1151 if (spec->owner_type != object_type)
1152 continue;
1153
1154 pos = flags;
1155 /* We use one-character flags for simplicity. */
1156 if (child_prop && !style_prop)
1157 *pos++ = 'c';
1158 if (style_prop)
1159 *pos++ = 's';
1160 if (spec->flags & G_PARAM_READABLE)
1161 *pos++ = 'r';
1162 if (spec->flags & G_PARAM_WRITABLE)
1163 *pos++ = 'w';
1164 if (spec->flags & G_PARAM_CONSTRUCT)
1165 *pos++ = 'x';
1166 if (spec->flags & G_PARAM_CONSTRUCT_ONLY)
1167 *pos++ = 'X';
1168 *pos = 0;
1169
1170 nick = g_param_spec_get_nick (spec);
1171 blurb = g_param_spec_get_blurb (spec);
1172
1173 dot = "";
1174 if (blurb) {
1175 int str_len = strlen (blurb);
1176 if (str_len > 0 && blurb[str_len - 1] != '.')
1177 dot = ".";
1178 }
1179
1180 type_desc = describe_type (spec);
1181 default_value = describe_default (spec);
1182 type_name = get_type_name (spec->value_type, &is_pointer);
1183 fprintf (fp, "<ARG>\n"
1184 "<NAME>%s::%s</NAME>\n"
1185 "<TYPE>%s%s</TYPE>\n"
1186 "<RANGE>%s</RANGE>\n"
1187 "<FLAGS>%s</FLAGS>\n"
1188 "<NICK>%s</NICK>\n"
1189 "<BLURB>%s%s</BLURB>\n"
1190 "<DEFAULT>%s</DEFAULT>\n"
1191 "</ARG>\n\n",
1192 object_class_name, g_param_spec_get_name (spec), type_name,
1193 is_pointer ? "*" : "", type_desc, flags, nick ? nick : "(null)",
1194 blurb ? blurb : "(null)", dot, default_value);
1195 g_free (type_desc);
1196 g_free (default_value);
1197 }
1198
1199 g_free (properties);
1200
1201#ifdef GTK_IS_CONTAINER_CLASS
1202#if !GTK_CHECK_VERSION(3,96,0)
1203 if (!child_prop && GTK_IS_CONTAINER_CLASS (class)) {
1204 properties = gtk_container_class_list_child_properties (class, &n_properties);
1205 child_prop = TRUE(!(0));
1206 continue;
1207 }
1208#endif
1209#endif
1210
1211#ifdef GTK_IS_CELL_AREA_CLASS
1212 if (!child_prop && GTK_IS_CELL_AREA_CLASS (class)) {
1213 properties = gtk_cell_area_class_list_cell_properties (class, &n_properties);
1214 child_prop = TRUE(!(0));
1215 continue;
1216 }
1217#endif
1218
1219#ifdef GTK_IS_WIDGET_CLASS
1220#if GTK_CHECK_VERSION(2,1,0) && !GTK_CHECK_VERSION(3,89,2)
1221 if (!style_prop && GTK_IS_WIDGET_CLASS (class)) {
1222 properties = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (class), &n_properties);
1223 style_prop = TRUE(!(0));
1224 continue;
1225 }
1226#endif
1227#endif
1228
1229
1230 break;
1231 }
1232}