diff options
Diffstat (limited to 'src/eggdbus/docbook.c')
-rw-r--r-- | src/eggdbus/docbook.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/eggdbus/docbook.c b/src/eggdbus/docbook.c index 888834d..37eafa5 100644 --- a/src/eggdbus/docbook.c +++ b/src/eggdbus/docbook.c @@ -799,3 +799,205 @@ interface_generate_docbook (const EggDBusInterfaceInfo *interface, return ret; } + +/* ---------------------------------------------------------------------------------------------------- */ + +gboolean +enum_generate_docbook (EnumData *enum_data, + GError **error) +{ + gboolean ret; + gchar *enum_summary_doc_string; + gchar *enum_doc_string; + const gchar *type_string; + guint n; + guint len; + guint max_len; + guint m; + + ret = FALSE; + + switch (enum_data->type) + { + case ENUM_DATA_TYPE_ERROR_DOMAIN: + type_string = "Error Domain"; + break; + + case ENUM_DATA_TYPE_FLAGS: + type_string = "Flags"; + break; + + case ENUM_DATA_TYPE_ENUM: + type_string = "Enumeration"; + break; + + default: + g_assert_not_reached (); + break; + } + + enum_summary_doc_string = get_summary_doc_string (enum_data->annotations, type_string); + enum_doc_string = get_doc_string (enum_data->annotations, type_string); + + g_print ("<?xml version=\"1.0\"?>\n" + "<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.1.2 //EN\"\n" + "\"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd\">\n"); + + g_print ("<refentry id=\"struct-%s\">\n", enum_data->name); + g_print (" <refmeta>\n"); + g_print (" <refentrytitle role=\"top_of_page\">%s</refentrytitle>\n", enum_data->name); + g_print (" </refmeta>\n"); + g_print (" <refnamediv>\n"); + g_print (" <refname>%s</refname>\n", enum_data->name); + g_print (" <refpurpose>%s</refpurpose>\n", enum_summary_doc_string); + g_print (" </refnamediv>\n"); + + g_print (" <refsect1>\n"); + + g_print (" <refsect2>\n"); + if (enum_data->type == ENUM_DATA_TYPE_ERROR_DOMAIN) + { + g_print (" <title><anchor role=\"enum\" id=\"%s\"/>The %s* Error Domain</title>\n", + enum_data->maximal_dbus_prefix, + enum_data->maximal_dbus_prefix); + } + else + { + g_print (" <title><anchor role=\"enum\" id=\"%s\"/>The %s %s</title>\n", + enum_data->name, + enum_data->name, + type_string); + } + g_print (" <para>\n"); + g_print (" <programlisting>\n"); + switch (enum_data->type) + { + case ENUM_DATA_TYPE_ERROR_DOMAIN: + g_print ("{\n"); + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + + if (n != 0) + g_print (",\n"); + + g_print (" %s", elem->name); + } + g_print ("\n" + "}\n"); + break; + + case ENUM_DATA_TYPE_FLAGS: + max_len = 0; + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + len = strlen (elem->name); + if (len > max_len) + max_len = len; + } + + g_print ("{\n"); + m = 1; + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + if (n != 0) + g_print (",\n"); + + if (elem->value != -1) + m = elem->value; + + len = strlen (elem->name); + g_print (" %s %*s= 0x%08x", elem->name, max_len - len, "", m); + + m *= 2; + } + g_print ("\n" + "}\n"); + break; + + case ENUM_DATA_TYPE_ENUM: + max_len = 0; + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + len = strlen (elem->name); + if (len > max_len) + max_len = len; + } + + g_print ("{\n"); + m = 0; + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + if (n != 0) + g_print (",\n"); + + if (elem->value != -1) + m = elem->value; + + len = strlen (elem->name); + g_print (" %s %*s= %d", elem->name, max_len - len, "", m); + + m++; + } + g_print ("\n" + "}\n"); + break; + } + g_print (" </programlisting>\n"); + g_print (" <para>\n"); + g_print ("%s\n", enum_doc_string); + g_print (" </para>\n"); + + g_print (" <variablelist role=\"constant\">\n"); + for (n = 0; n < enum_data->num_elements; n++) + { + EnumElemData *elem = enum_data->elements[n]; + gchar *enum_doc_string; + + enum_doc_string = get_doc_string (elem->annotations, "Enum"); + + switch (enum_data->type) + { + case ENUM_DATA_TYPE_ERROR_DOMAIN: + g_print (" <varlistentry id=\"constant-%s\" role=\"constant\">\n", elem->name); + break; + + case ENUM_DATA_TYPE_FLAGS: + g_print (" <varlistentry id=\"constant-%s.%s\" role=\"constant\">\n", enum_data->name, elem->name); + break; + + case ENUM_DATA_TYPE_ENUM: + g_print (" <varlistentry id=\"constant-%s.%s\" role=\"constant\">\n", enum_data->name, elem->name); + break; + } + g_print (" <term><literal>%s</literal></term>\n", elem->name); + g_print (" <listitem>\n"); + g_print (" <para>\n"); + g_print ("%s\n", enum_doc_string); + g_print (" </para>\n"); + g_print (" </listitem>\n"); + g_print (" </varlistentry>\n"); + + g_free (enum_doc_string); + } + g_print (" </variablelist>\n"); + g_print (" </para>\n"); + g_print (" </refsect2>\n"); + + g_print (" </refsect1>\n"); + + + g_print ("</refentry>\n"); + + ret = TRUE; + + g_free (enum_doc_string); + g_free (enum_summary_doc_string); + + return ret; +} + |