diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | tools/generate.c | 471 |
2 files changed, 270 insertions, 212 deletions
@@ -1,5 +1,16 @@ 2008-10-15 Tommi Komulainen <tommi.komulainen@iki.fi> + * tools/generate.c (xml_printf, xml_open, xml_close, xml_free): + (write_type_name, write_type_info, write_field_info, + write_callable_info, write_function_info, write_callback_info, + write_struct_info, write_value_info, write_constant_value, + write_constant_info, write_enum_info, write_signal_info, + write_vfunc_info, write_property_info, write_object_info, + write_interface_info, write_error_domain_info, write_union_info, + write_repository): wrap all FILE access to go through simple xmlwriter + +2008-10-15 Tommi Komulainen <tommi.komulainen@iki.fi> + Bug 556400 – Fails to build on OS X 10.4 * configure.ac: check for functions backtrace and backtrace_symbols diff --git a/tools/generate.c b/tools/generate.c index 224d2b40..6991ba30 100644 --- a/tools/generate.c +++ b/tools/generate.c @@ -33,6 +33,51 @@ static gchar *output = NULL; gchar **includedirs = NULL; +typedef struct { + FILE *file; +} Xml; + +static void +xml_printf (Xml *xml, const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + vfprintf (xml->file, fmt, ap); + va_end (ap); +} + +static Xml * +xml_open (FILE *file) +{ + Xml *xml; + + xml = g_new (Xml, 1); + xml->file = file; + + return xml; +} + +static void +xml_close (Xml *xml) +{ + if (xml->file != NULL) + { + fflush (xml->file); + if (xml->file != stdout) + fclose (xml->file); + xml->file = NULL; + } +} + +static void +xml_free (Xml *xml) +{ + xml_close (xml); + g_free (xml); +} + + static void check_unresolved (GIBaseInfo *info) { @@ -46,18 +91,18 @@ check_unresolved (GIBaseInfo *info) static void write_type_name (const gchar *namespace, GIBaseInfo *info, - FILE *file) + Xml *file) { if (strcmp (namespace, g_base_info_get_namespace (info)) != 0) - g_fprintf (file, "%s.", g_base_info_get_namespace (info)); + xml_printf (file, "%s.", g_base_info_get_namespace (info)); - g_fprintf (file, "%s", g_base_info_get_name (info)); + xml_printf (file, "%s", g_base_info_get_name (info)); } static void write_type_info (const gchar *namespace, GITypeInfo *info, - FILE *file) + Xml *file) { gint tag; gint i; @@ -72,29 +117,29 @@ write_type_info (const gchar *namespace, if (tag == GI_TYPE_TAG_VOID) { if (is_pointer) - g_fprintf (file, "%s", "any"); + xml_printf (file, "%s", "any"); else - g_fprintf (file, "%s", "none"); + xml_printf (file, "%s", "none"); } else if (G_TYPE_TAG_IS_BASIC (tag)) - g_fprintf (file, "%s", g_type_tag_to_string (tag)); + xml_printf (file, "%s", g_type_tag_to_string (tag)); else if (tag == GI_TYPE_TAG_ARRAY) { gint length; type = g_type_info_get_param_type (info, 0); write_type_info (namespace, type, file); - g_fprintf (file, "["); + xml_printf (file, "["); length = g_type_info_get_array_length (info); if (length >= 0) - g_fprintf (file, "length=%d", length); + xml_printf (file, "length=%d", length); if (g_type_info_is_zero_terminated (info)) - g_fprintf (file, "%szero-terminated=1", length >= 0 ? "," : ""); + xml_printf (file, "%szero-terminated=1", length >= 0 ? "," : ""); - g_fprintf (file, "]"); + xml_printf (file, "]"); g_base_info_unref ((GIBaseInfo *)type); } else if (tag == GI_TYPE_TAG_INTERFACE) @@ -106,40 +151,40 @@ write_type_info (const gchar *namespace, else if (tag == GI_TYPE_TAG_GLIST) { type = g_type_info_get_param_type (info, 0); - g_fprintf (file, "GLib.List"); + xml_printf (file, "GLib.List"); if (type) { - g_fprintf (file, "<"); + xml_printf (file, "<"); write_type_info (namespace, type, file); - g_fprintf (file, ">"); + xml_printf (file, ">"); g_base_info_unref ((GIBaseInfo *)type); } } else if (tag == GI_TYPE_TAG_GSLIST) { type = g_type_info_get_param_type (info, 0); - g_fprintf (file, "GLib.SList"); + xml_printf (file, "GLib.SList"); if (type) { - g_fprintf (file, "<"); + xml_printf (file, "<"); write_type_info (namespace, type, file); - g_fprintf (file, ">"); + xml_printf (file, ">"); g_base_info_unref ((GIBaseInfo *)type); } } else if (tag == GI_TYPE_TAG_GHASH) { type = g_type_info_get_param_type (info, 0); - g_fprintf (file, "GLib.HashTable"); + xml_printf (file, "GLib.HashTable"); if (type) { - g_fprintf (file, "<"); + xml_printf (file, "<"); write_type_info (namespace, type, file); g_base_info_unref ((GIBaseInfo *)type); type = g_type_info_get_param_type (info, 1); - g_fprintf (file, ","); + xml_printf (file, ","); write_type_info (namespace, type, file); - g_fprintf (file, ">"); + xml_printf (file, ">"); g_base_info_unref ((GIBaseInfo *)type); } } @@ -147,20 +192,20 @@ write_type_info (const gchar *namespace, { gint n; - g_fprintf (file, "GLib.Error"); + xml_printf (file, "GLib.Error"); n = g_type_info_get_n_error_domains (info); if (n > 0) { - g_fprintf (file, "<"); + xml_printf (file, "<"); for (i = 0; i < n; i++) { GIErrorDomainInfo *ed = g_type_info_get_error_domain (info, i); if (i > 0) - g_fprintf (file, ","); + xml_printf (file, ","); write_type_name (namespace, (GIBaseInfo *)ed, file); g_base_info_unref ((GIBaseInfo *)ed); } - g_fprintf (file, ">"); + xml_printf (file, ">"); } } else @@ -174,13 +219,13 @@ static void write_constant_value (const gchar *namespace, GITypeInfo *info, GArgument *argument, - FILE *file); + Xml *file); static void write_field_info (const gchar *namespace, GIFieldInfo *info, GIConstantInfo *branch, - FILE *file) + Xml *file) { const gchar *name; GIFieldInfoFlags flags; @@ -194,44 +239,44 @@ write_field_info (const gchar *namespace, size = g_field_info_get_size (info); offset = g_field_info_get_offset (info); - g_fprintf (file, + xml_printf (file, " <field name=\"%s\" readable=\"%s\" writable=\"%s\"", name, flags & GI_FIELD_IS_READABLE ? "1" : "0", flags & GI_FIELD_IS_WRITABLE ? "1" : "0"); if (size) - g_fprintf (file, " bits=\"%d\"", size); + xml_printf (file, " bits=\"%d\"", size); - g_fprintf (file, " offset=\"%d\"", offset); + xml_printf (file, " offset=\"%d\"", offset); type = g_field_info_get_type (info); if (branch) { - g_fprintf (file, " branch=\""); + xml_printf (file, " branch=\""); type = g_constant_info_get_type (branch); g_constant_info_get_value (branch, &value); write_constant_value (namespace, type, &value, file); - g_fprintf (file, "\""); + xml_printf (file, "\""); } - g_fprintf (file,">\n"); + xml_printf (file,">\n"); - g_fprintf (file, " <type name=\""); + xml_printf (file, " <type name=\""); write_type_info (namespace, type, file); g_base_info_unref ((GIBaseInfo *)type); - g_fprintf (file, "\"/>\n"); + xml_printf (file, "\"/>\n"); - g_fprintf (file, " </field>\n"); + xml_printf (file, " </field>\n"); } static void write_callable_info (const gchar *namespace, GICallableInfo *info, - FILE *file, + Xml *file, gint indent) { GITypeInfo *type; @@ -239,9 +284,9 @@ write_callable_info (const gchar *namespace, type = g_callable_info_get_return_type (info); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); - g_fprintf (file, "%*s <return-value", indent, ""); + xml_printf (file, "%*s <return-value", indent, ""); if (g_type_info_is_pointer (type)) { @@ -250,10 +295,10 @@ write_callable_info (const gchar *namespace, case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: - g_fprintf (file, " transfer-ownership=\"container\""); + xml_printf (file, " transfer-ownership=\"container\""); break; case GI_TRANSFER_EVERYTHING: - g_fprintf (file, " transfer-ownership=\"full\""); + xml_printf (file, " transfer-ownership=\"full\""); break; default: g_assert_not_reached (); @@ -261,27 +306,27 @@ write_callable_info (const gchar *namespace, } if (g_callable_info_may_return_null (info)) - g_fprintf (file, " null-ok=\"1\""); + xml_printf (file, " null-ok=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); - g_fprintf (file, "%*s <type name=\"", indent + 2, ""); + xml_printf (file, "%*s <type name=\"", indent + 2, ""); write_type_info (namespace, type, file); - g_fprintf (file, "\"/>\n"); + xml_printf (file, "\"/>\n"); - g_fprintf (file, "%*s </return-value>\n", indent, ""); + xml_printf (file, "%*s </return-value>\n", indent, ""); if (g_callable_info_get_n_args (info) <= 0) return; - g_fprintf (file, "%*s <parameters>\n", indent, ""); + xml_printf (file, "%*s <parameters>\n", indent, ""); for (i = 0; i < g_callable_info_get_n_args (info); i++) { GIArgInfo *arg = g_callable_info_get_arg (info, i); - g_fprintf (file, "%*s <parameter name=\"%s\"", + xml_printf (file, "%*s <parameter name=\"%s\"", indent, "", g_base_info_get_name ((GIBaseInfo *) arg)); switch (g_arg_info_get_ownership_transfer (arg)) @@ -289,64 +334,64 @@ write_callable_info (const gchar *namespace, case GI_TRANSFER_NOTHING: break; case GI_TRANSFER_CONTAINER: - g_fprintf (file, " transfer=\"container\""); + xml_printf (file, " transfer=\"container\""); break; case GI_TRANSFER_EVERYTHING: - g_fprintf (file, " transfer=\"full\""); + xml_printf (file, " transfer=\"full\""); break; default: g_assert_not_reached (); } - g_fprintf (file, " direction=\""); + xml_printf (file, " direction=\""); switch (g_arg_info_get_direction (arg)) { case GI_DIRECTION_IN: - g_fprintf (file, "in"); + xml_printf (file, "in"); break; case GI_DIRECTION_OUT: - g_fprintf (file, "out"); + xml_printf (file, "out"); break; case GI_DIRECTION_INOUT: - g_fprintf (file, "inout"); + xml_printf (file, "inout"); break; } - g_fprintf (file, "\""); + xml_printf (file, "\""); if (g_arg_info_may_be_null (arg)) - g_fprintf (file, " null-ok=\"1\""); + xml_printf (file, " null-ok=\"1\""); if (g_arg_info_is_dipper (arg)) - g_fprintf (file, " dipper=\"1\""); + xml_printf (file, " dipper=\"1\""); if (g_arg_info_is_return_value (arg)) - g_fprintf (file, " retval=\"1\""); + xml_printf (file, " retval=\"1\""); if (g_arg_info_is_optional (arg)) - g_fprintf (file, " optional=\"1\""); + xml_printf (file, " optional=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); - g_fprintf (file, "%*s <type name=\"", indent+2, ""); + xml_printf (file, "%*s <type name=\"", indent+2, ""); type = g_arg_info_get_type (arg); write_type_info (namespace, type, file); - g_fprintf (file, "\"/>\n"); + xml_printf (file, "\"/>\n"); - g_fprintf (file, "%*s </parameter>\n", indent, ""); + xml_printf (file, "%*s </parameter>\n", indent, ""); g_base_info_unref ((GIBaseInfo *)arg); } - g_fprintf (file, "%*s </parameters>\n", indent, ""); + xml_printf (file, "%*s </parameters>\n", indent, ""); g_base_info_unref ((GIBaseInfo *)type); } static void write_function_info (const gchar *namespace, GIFunctionInfo *info, - FILE *file, + Xml *file, gint indent) { GIFunctionInfoFlags flags; @@ -367,25 +412,25 @@ write_function_info (const gchar *namespace, else tag = "function"; - g_fprintf (file, "%*s<%s name=\"%s\" c:identifier=\"%s\"", - indent, "", tag, name, symbol); + xml_printf (file, "%*s<%s name=\"%s\" c:identifier=\"%s\"", + indent, "", tag, name, symbol); if (flags & GI_FUNCTION_IS_SETTER) - g_fprintf (file, " type=\"setter\""); + xml_printf (file, " type=\"setter\""); else if (flags & GI_FUNCTION_IS_GETTER) - g_fprintf (file, " type=\"getter\""); + xml_printf (file, " type=\"getter\""); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); write_callable_info (namespace, (GICallableInfo*)info, file, indent); - g_fprintf (file, "%*s</%s>\n", indent, "", tag); + xml_printf (file, "%*s</%s>\n", indent, "", tag); } static void write_callback_info (const gchar *namespace, GICallbackInfo *info, - FILE *file, + Xml *file, gint indent) { const gchar *name; @@ -394,19 +439,19 @@ write_callback_info (const gchar *namespace, name = g_base_info_get_name ((GIBaseInfo *)info); deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); - g_fprintf (file, "%*s<callback name=\"%s\"", indent, "", name); + xml_printf (file, "%*s<callback name=\"%s\"", indent, "", name); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); write_callable_info (namespace, (GICallableInfo*)info, file, indent); - g_fprintf (file, "%*s</callback>\n", indent, ""); + xml_printf (file, "%*s</callback>\n", indent, ""); } static void write_struct_info (const gchar *namespace, GIStructInfo *info, - FILE *file) + Xml *file) { const gchar *name; const gchar *type_name; @@ -423,21 +468,21 @@ write_struct_info (const gchar *namespace, if (g_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_BOXED) { - g_fprintf (file, " <glib:boxed glib:name=\"%s\"", name); + xml_printf (file, " <glib:boxed glib:name=\"%s\"", name); } else - g_fprintf (file, " <record name=\"%s\"", name); + xml_printf (file, " <record name=\"%s\"", name); if (type_name != NULL) - g_fprintf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); n_elts = g_struct_info_get_n_fields (info) + g_struct_info_get_n_methods (info); if (n_elts > 0) { - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); for (i = 0; i < g_struct_info_get_n_fields (info); i++) { @@ -454,20 +499,20 @@ write_struct_info (const gchar *namespace, } if (g_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_BOXED) - g_fprintf (file, " </glib:boxed>\n"); + xml_printf (file, " </glib:boxed>\n"); else - g_fprintf (file, " </record>\n"); + xml_printf (file, " </record>\n"); } else { - g_fprintf (file, "/>\n"); + xml_printf (file, "/>\n"); } } static void write_value_info (const gchar *namespace, GIValueInfo *info, - FILE *file) + Xml *file) { const gchar *name; glong value; @@ -477,76 +522,76 @@ write_value_info (const gchar *namespace, value = g_value_info_get_value (info); deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); - g_fprintf (file, " <member name=\"%s\" value=\"%ld\"", name, value); + xml_printf (file, " <member name=\"%s\" value=\"%ld\"", name, value); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); - g_fprintf (file, " />\n"); + xml_printf (file, " />\n"); } static void write_constant_value (const gchar *namespace, GITypeInfo *type, GArgument *value, - FILE *file) + Xml *file) { switch (g_type_info_get_tag (type)) { case GI_TYPE_TAG_BOOLEAN: - g_fprintf (file, "%d", value->v_boolean); + xml_printf (file, "%d", value->v_boolean); break; case GI_TYPE_TAG_INT8: - g_fprintf (file, "%d", value->v_int8); + xml_printf (file, "%d", value->v_int8); break; case GI_TYPE_TAG_UINT8: - g_fprintf (file, "%d", value->v_uint8); + xml_printf (file, "%d", value->v_uint8); break; case GI_TYPE_TAG_INT16: - g_fprintf (file, "%" G_GINT16_FORMAT, value->v_int16); + xml_printf (file, "%" G_GINT16_FORMAT, value->v_int16); break; case GI_TYPE_TAG_UINT16: - g_fprintf (file, "%" G_GUINT16_FORMAT, value->v_uint16); + xml_printf (file, "%" G_GUINT16_FORMAT, value->v_uint16); break; case GI_TYPE_TAG_INT32: - g_fprintf (file, "%" G_GINT32_FORMAT, value->v_int32); + xml_printf (file, "%" G_GINT32_FORMAT, value->v_int32); break; case GI_TYPE_TAG_UINT32: - g_fprintf (file, "%" G_GUINT32_FORMAT, value->v_uint32); + xml_printf (file, "%" G_GUINT32_FORMAT, value->v_uint32); break; case GI_TYPE_TAG_INT64: - g_fprintf (file, "%" G_GINT64_FORMAT, value->v_int64); + xml_printf (file, "%" G_GINT64_FORMAT, value->v_int64); break; case GI_TYPE_TAG_UINT64: - g_fprintf (file, "%" G_GUINT64_FORMAT, value->v_uint64); + xml_printf (file, "%" G_GUINT64_FORMAT, value->v_uint64); break; case GI_TYPE_TAG_INT: - g_fprintf (file, "%d", value->v_int); + xml_printf (file, "%d", value->v_int); break; case GI_TYPE_TAG_UINT: - g_fprintf (file, "%d", value->v_uint); + xml_printf (file, "%d", value->v_uint); break; case GI_TYPE_TAG_LONG: - g_fprintf (file, "%ld", value->v_long); + xml_printf (file, "%ld", value->v_long); break; case GI_TYPE_TAG_ULONG: - g_fprintf (file, "%ld", value->v_ulong); + xml_printf (file, "%ld", value->v_ulong); break; case GI_TYPE_TAG_SSIZE: - g_fprintf (file, "%zd", value->v_ssize); + xml_printf (file, "%zd", value->v_ssize); break; case GI_TYPE_TAG_SIZE: - g_fprintf (file, "%zd", value->v_size); + xml_printf (file, "%zd", value->v_size); break; case GI_TYPE_TAG_FLOAT: - g_fprintf (file, "%f", value->v_float); + xml_printf (file, "%f", value->v_float); break; case GI_TYPE_TAG_DOUBLE: - g_fprintf (file, "%f", value->v_double); + xml_printf (file, "%f", value->v_double); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: - g_fprintf (file, "%s", value->v_string); + xml_printf (file, "%s", value->v_string); break; default: g_assert_not_reached (); @@ -556,7 +601,7 @@ write_constant_value (const gchar *namespace, static void write_constant_info (const gchar *namespace, GIConstantInfo *info, - FILE *file, + Xml *file, gint indent) { GITypeInfo *type; @@ -567,22 +612,22 @@ write_constant_info (const gchar *namespace, name = g_base_info_get_name ((GIBaseInfo *)info); deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); - g_fprintf (file, "%*s<constant name=\"%s\"", indent, "", name); + xml_printf (file, "%*s<constant name=\"%s\"", indent, "", name); type = g_constant_info_get_type (info); - g_fprintf (file, " value=\""); + xml_printf (file, " value=\""); g_constant_info_get_value (info, &value); write_constant_value (namespace, type, &value, file); - g_fprintf (file, "\">\n"); + xml_printf (file, "\">\n"); - g_fprintf (file, "%*s<type name=\"", indent + 2, ""); + xml_printf (file, "%*s<type name=\"", indent + 2, ""); write_type_info (namespace, type, file); - g_fprintf (file, "\"/>\n"); + xml_printf (file, "\"/>\n"); - g_fprintf (file, "%*s</constant>\n", indent, ""); + xml_printf (file, "%*s</constant>\n", indent, ""); g_base_info_unref ((GIBaseInfo *)type); } @@ -591,7 +636,7 @@ write_constant_info (const gchar *namespace, static void write_enum_info (const gchar *namespace, GIEnumInfo *info, - FILE *file) + Xml *file) { const gchar *name; const gchar *type_name; @@ -606,18 +651,18 @@ write_enum_info (const gchar *namespace, type_init = g_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); if (g_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_ENUM) - g_fprintf (file, " <enumeration "); + xml_printf (file, " <enumeration "); else - g_fprintf (file, " <bitfield "); - g_fprintf (file, "name=\"%s\"", name); + xml_printf (file, " <bitfield "); + xml_printf (file, "name=\"%s\"", name); if (type_init) - g_fprintf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); for (i = 0; i < g_enum_info_get_n_values (info); i++) { @@ -627,15 +672,15 @@ write_enum_info (const gchar *namespace, } if (g_base_info_get_type ((GIBaseInfo *)info) == GI_INFO_TYPE_ENUM) - g_fprintf (file, " </enumeration>\n"); + xml_printf (file, " </enumeration>\n"); else - g_fprintf (file, " </bitfield>\n"); + xml_printf (file, " </bitfield>\n"); } static void write_signal_info (const gchar *namespace, GISignalInfo *info, - FILE *file) + Xml *file) { GSignalFlags flags; const gchar *name; @@ -645,39 +690,39 @@ write_signal_info (const gchar *namespace, flags = g_signal_info_get_flags (info); deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); - g_fprintf (file, " <glib:signal name=\"%s\"", name); + xml_printf (file, " <glib:signal name=\"%s\"", name); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); if (flags & G_SIGNAL_RUN_FIRST) - g_fprintf (file, " when=\"FIRST\""); + xml_printf (file, " when=\"FIRST\""); else if (flags & G_SIGNAL_RUN_LAST) - g_fprintf (file, " when=\"LAST\""); + xml_printf (file, " when=\"LAST\""); else if (flags & G_SIGNAL_RUN_CLEANUP) - g_fprintf (file, " when=\"CLEANUP\""); + xml_printf (file, " when=\"CLEANUP\""); if (flags & G_SIGNAL_NO_RECURSE) - g_fprintf (file, " no-recurse=\"1\""); + xml_printf (file, " no-recurse=\"1\""); if (flags & G_SIGNAL_DETAILED) - g_fprintf (file, " detailed=\"1\""); + xml_printf (file, " detailed=\"1\""); if (flags & G_SIGNAL_ACTION) - g_fprintf (file, " action=\"1\""); + xml_printf (file, " action=\"1\""); if (flags & G_SIGNAL_NO_HOOKS) - g_fprintf (file, " no-hooks=\"1\""); + xml_printf (file, " no-hooks=\"1\""); write_callable_info (namespace, (GICallableInfo*)info, file, 6); - g_fprintf (file, " </glib:signal>\n"); + xml_printf (file, " </glib:signal>\n"); } static void write_vfunc_info (const gchar *namespace, GIVFuncInfo *info, - FILE *file) + Xml *file) { GIVFuncInfoFlags flags; const gchar *name; @@ -689,30 +734,30 @@ write_vfunc_info (const gchar *namespace, deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); offset = g_vfunc_info_get_offset (info); - g_fprintf (file, " <vfunc name=\"%s\"", name); + xml_printf (file, " <vfunc name=\"%s\"", name); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); if (flags & GI_VFUNC_MUST_CHAIN_UP) - g_fprintf (file, " must-chain-up=\"1\""); + xml_printf (file, " must-chain-up=\"1\""); if (flags & GI_VFUNC_MUST_OVERRIDE) - g_fprintf (file, " override=\"always\""); + xml_printf (file, " override=\"always\""); else if (flags & GI_VFUNC_MUST_NOT_OVERRIDE) - g_fprintf (file, " override=\"never\""); + xml_printf (file, " override=\"never\""); - g_fprintf (file, " offset=\"%d\"", offset); + xml_printf (file, " offset=\"%d\"", offset); write_callable_info (namespace, (GICallableInfo*)info, file, 6); - g_fprintf (file, " </vfunc>\n"); + xml_printf (file, " </vfunc>\n"); } static void write_property_info (const gchar *namespace, GIPropertyInfo *info, - FILE *file) + Xml *file) { GParamFlags flags; const gchar *name; @@ -723,45 +768,45 @@ write_property_info (const gchar *namespace, flags = g_property_info_get_flags (info); deprecated = g_base_info_is_deprecated ((GIBaseInfo *)info); - g_fprintf (file, " <property name=\"%s\"", name); + xml_printf (file, " <property name=\"%s\"", name); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); if (flags & G_PARAM_READABLE) - g_fprintf (file, " readable=\"1\""); + xml_printf (file, " readable=\"1\""); else - g_fprintf (file, " readable=\"0\""); + xml_printf (file, " readable=\"0\""); if (flags & G_PARAM_WRITABLE) - g_fprintf (file, " writable=\"1\""); + xml_printf (file, " writable=\"1\""); else - g_fprintf (file, " writable=\"0\""); + xml_printf (file, " writable=\"0\""); if (flags & G_PARAM_CONSTRUCT) - g_fprintf (file, " construct=\"1\""); + xml_printf (file, " construct=\"1\""); if (flags & G_PARAM_CONSTRUCT_ONLY) - g_fprintf (file, " construct-only=\"1\""); + xml_printf (file, " construct-only=\"1\""); type = g_property_info_get_type (info); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); - g_fprintf (file, " <type name=\"", name); + xml_printf (file, " <type name=\"", name); write_type_info (namespace, type, file); - g_fprintf (file, "\"/>\n"); + xml_printf (file, "\"/>\n"); - g_fprintf (file, " </property>\n"); + xml_printf (file, " </property>\n"); } static void write_object_info (const gchar *namespace, GIObjectInfo *info, - FILE *file) + Xml *file) { const gchar *name; const gchar *type_name; @@ -775,32 +820,32 @@ write_object_info (const gchar *namespace, type_name = g_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); type_init = g_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); - g_fprintf (file, " <class name=\"%s\"", name); + xml_printf (file, " <class name=\"%s\"", name); pnode = g_object_info_get_parent (info); if (pnode) { - g_fprintf (file, " parent=\""); + xml_printf (file, " parent=\""); write_type_name (namespace, (GIBaseInfo *)pnode, file); - g_fprintf (file, "\"" ); + xml_printf (file, "\"" ); g_base_info_unref ((GIBaseInfo *)pnode); } - g_fprintf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); if (g_object_info_get_n_interfaces (info) > 0) { for (i = 0; i < g_object_info_get_n_interfaces (info); i++) { GIInterfaceInfo *imp = g_object_info_get_interface (info, i); - g_fprintf (file, " <implements name=\""); + xml_printf (file, " <implements name=\""); write_type_name (namespace, (GIBaseInfo*)imp, file); - g_fprintf (file,"\" />\n"); + xml_printf (file,"\" />\n"); g_base_info_unref ((GIBaseInfo*)imp); } } @@ -847,13 +892,13 @@ write_object_info (const gchar *namespace, g_base_info_unref ((GIBaseInfo *)constant); } - g_fprintf (file, " </class>\n"); + xml_printf (file, " </class>\n"); } static void write_interface_info (const gchar *namespace, GIInterfaceInfo *info, - FILE *file) + Xml *file) { const gchar *name; const gchar *type_name; @@ -866,30 +911,30 @@ write_interface_info (const gchar *namespace, type_name = g_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); type_init = g_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); - g_fprintf (file, " <interface name=\"%s\" glib:type-name=\"%s\" glib:get-type=\"%s\"", + xml_printf (file, " <interface name=\"%s\" glib:type-name=\"%s\" glib:get-type=\"%s\"", name, type_name, type_init); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); if (g_interface_info_get_n_prerequisites (info) > 0) { - g_fprintf (file, " <requires>\n"); + xml_printf (file, " <requires>\n"); for (i = 0; i < g_interface_info_get_n_prerequisites (info); i++) { GIBaseInfo *req = g_interface_info_get_prerequisite (info, i); if (g_base_info_get_type (req) == GI_INFO_TYPE_INTERFACE) - g_fprintf (file, " <interface name=\""); + xml_printf (file, " <interface name=\""); else - g_fprintf (file, " <object name=\""); + xml_printf (file, " <object name=\""); write_type_name (namespace, req, file); - g_fprintf (file, "\" />\n"); + xml_printf (file, "\" />\n"); g_base_info_unref (req); } - g_fprintf (file, " </requires>\n"); + xml_printf (file, " </requires>\n"); } for (i = 0; i < g_interface_info_get_n_methods (info); i++) @@ -927,13 +972,13 @@ write_interface_info (const gchar *namespace, g_base_info_unref ((GIBaseInfo *)constant); } - g_fprintf (file, " </interface>\n"); + xml_printf (file, " </interface>\n"); } static void write_error_domain_info (const gchar *namespace, GIErrorDomainInfo *info, - FILE *file) + Xml *file) { GIBaseInfo *enum_; const gchar *name, *quark; @@ -941,18 +986,18 @@ write_error_domain_info (const gchar *namespace, name = g_base_info_get_name ((GIBaseInfo *)info); quark = g_error_domain_info_get_quark (info); enum_ = (GIBaseInfo *)g_error_domain_info_get_codes (info); - g_fprintf (file, + xml_printf (file, " <errordomain name=\"%s\" get-quark=\"%s\" codes=\"", name, quark); write_type_name (namespace, enum_, file); - g_fprintf (file, "\" />\n"); + xml_printf (file, "\" />\n"); g_base_info_unref (enum_); } static void write_union_info (const gchar *namespace, GIUnionInfo *info, - FILE *file) + Xml *file) { const gchar *name; const gchar *type_name; @@ -966,15 +1011,15 @@ write_union_info (const gchar *namespace, type_name = g_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); type_init = g_registered_type_info_get_type_init ((GIRegisteredTypeInfo*)info); - g_fprintf (file, " <union name=\"%s\"", name); + xml_printf (file, " <union name=\"%s\"", name); if (type_name) - g_fprintf (file, " type-name=\"%s\" get-type=\"%s\"", type_name, type_init); + xml_printf (file, " type-name=\"%s\" get-type=\"%s\"", type_name, type_init); if (deprecated) - g_fprintf (file, " deprecated=\"1\""); + xml_printf (file, " deprecated=\"1\""); - g_fprintf (file, ">\n"); + xml_printf (file, ">\n"); if (g_union_info_is_discriminated (info)) { @@ -984,9 +1029,9 @@ write_union_info (const gchar *namespace, offset = g_union_info_get_discriminator_offset (info); type = g_union_info_get_discriminator_type (info); - g_fprintf (file, " <discriminator offset=\"%d\" type=\"", offset); + xml_printf (file, " <discriminator offset=\"%d\" type=\"", offset); write_type_info (namespace, type, file); - g_fprintf (file, "\" />\n"); + xml_printf (file, "\" />\n"); g_base_info_unref ((GIBaseInfo *)type); } @@ -1007,23 +1052,24 @@ write_union_info (const gchar *namespace, g_base_info_unref ((GIBaseInfo *)function); } - g_fprintf (file, " </union>\n"); + xml_printf (file, " </union>\n"); } static void write_repository (const char *namespace, gboolean needs_prefix) { - FILE *file; + FILE *ofile; gchar *ns; gint i, j; char **dependencies; GIRepository *repository; + Xml *xml; repository = g_irepository_get_default (); if (output == NULL) - file = stdout; + ofile = stdout; else { gchar *filename; @@ -1032,9 +1078,9 @@ write_repository (const char *namespace, filename = g_strdup_printf ("%s-%s", namespace, output); else filename = g_strdup (output); - file = g_fopen (filename, "w"); + ofile = g_fopen (filename, "w"); - if (file == NULL) + if (ofile == NULL) { g_fprintf (stderr, "failed to open '%s': %s\n", filename, g_strerror (errno)); @@ -1045,12 +1091,14 @@ write_repository (const char *namespace, g_free (filename); } + + xml = xml_open (ofile); - g_fprintf (file, "<?xml version=\"1.0\"?>\n"); - g_fprintf (file, "<repository version=\"1.0\"\n" - " xmlns=\"http://www.gtk.org/introspection/core/1.0\"\n" - " xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n" - " xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\">\n"); + xml_printf (xml, "<?xml version=\"1.0\"?>\n"); + xml_printf (xml, "<repository version=\"1.0\"\n" + " xmlns=\"http://www.gtk.org/introspection/core/1.0\"\n" + " xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n" + " xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\">\n"); dependencies = g_irepository_get_dependencies (repository, namespace); @@ -1058,7 +1106,7 @@ write_repository (const char *namespace, { for (i = 0; dependencies[i]; i++) { - g_fprintf (file, " <include name=\"%s\"/>\n", dependencies[i]); + xml_printf (xml, " <include name=\"%s\"/>\n", dependencies[i]); } } @@ -1072,10 +1120,10 @@ write_repository (const char *namespace, shared_library = g_irepository_get_shared_library (repository, ns); if (shared_library) - g_fprintf (file, " <namespace name=\"%s\" version=\"%s\" shared-library=\"%s\">\n", - ns, version, shared_library); + xml_printf (xml, " <namespace name=\"%s\" version=\"%s\" shared-library=\"%s\">\n", + ns, version, shared_library); else - g_fprintf (file, " <namespace name=\"%s\" version=\"%s\">\n", ns, version); + xml_printf (xml, " <namespace name=\"%s\" version=\"%s\">\n", ns, version); for (j = 0; j < g_irepository_get_n_infos (repository, ns); j++) { @@ -1083,41 +1131,41 @@ write_repository (const char *namespace, switch (g_base_info_get_type (info)) { case GI_INFO_TYPE_FUNCTION: - write_function_info (ns, (GIFunctionInfo *)info, file, 4); + write_function_info (ns, (GIFunctionInfo *)info, xml, 4); break; case GI_INFO_TYPE_CALLBACK: - write_callback_info (ns, (GICallbackInfo *)info, file, 4); + write_callback_info (ns, (GICallbackInfo *)info, xml, 4); break; case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_BOXED: - write_struct_info (ns, (GIStructInfo *)info, file); + write_struct_info (ns, (GIStructInfo *)info, xml); break; case GI_INFO_TYPE_UNION: - write_union_info (ns, (GIUnionInfo *)info, file); + write_union_info (ns, (GIUnionInfo *)info, xml); break; case GI_INFO_TYPE_ENUM: case GI_INFO_TYPE_FLAGS: - write_enum_info (ns, (GIEnumInfo *)info, file); + write_enum_info (ns, (GIEnumInfo *)info, xml); break; case GI_INFO_TYPE_CONSTANT: - write_constant_info (ns, (GIConstantInfo *)info, file, 4); + write_constant_info (ns, (GIConstantInfo *)info, xml, 4); break; case GI_INFO_TYPE_OBJECT: - write_object_info (ns, (GIObjectInfo *)info, file); + write_object_info (ns, (GIObjectInfo *)info, xml); break; case GI_INFO_TYPE_INTERFACE: - write_interface_info (ns, (GIInterfaceInfo *)info, file); + write_interface_info (ns, (GIInterfaceInfo *)info, xml); break; case GI_INFO_TYPE_ERROR_DOMAIN: - write_error_domain_info (ns, (GIErrorDomainInfo *)info, file); + write_error_domain_info (ns, (GIErrorDomainInfo *)info, xml); break; default: @@ -1127,13 +1175,12 @@ write_repository (const char *namespace, g_base_info_unref (info); } - g_fprintf (file, " </namespace>\n"); + xml_printf (xml, " </namespace>\n"); } - g_fprintf (file, "</repository>\n"); + xml_printf (xml, "</repository>\n"); - if (output != NULL) - fclose (file); + xml_free (xml); } static const guchar * |