/* GObject introspection: gen-introspect
*
* Copyright (C) 2007 Jürg Billeter
+ * Copyright (C) 2007 Johan Dahlin
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#include "scanner.h"
#include "gidlnode.h"
-static void node_generate (GIGenerator * igenerator, GIdlNode * node);
+typedef struct {
+ int indent;
+ FILE *output;
+} GIdlWriter;
+
+static void node_generate (GIdlWriter * writer, GIdlNode * node);
static void
-g_igenerator_write_inline (GIGenerator * igenerator, const char *s)
+g_writer_write_inline (GIdlWriter * writer, const char *s)
{
- fprintf (stdout, "%s", s);
+ fprintf (writer->output, "%s", s);
}
static void
-g_igenerator_write (GIGenerator * igenerator, const char *s)
+g_writer_write (GIdlWriter * writer, const char *s)
{
int i;
- for (i = 0; i < igenerator->indent; i++)
+ for (i = 0; i < writer->indent; i++)
{
- fprintf (stdout, "\t");
+ fprintf (writer->output, "\t");
}
- g_igenerator_write_inline (igenerator, s);
+ g_writer_write_inline (writer, s);
}
static void
-g_igenerator_write_indent (GIGenerator * igenerator, const char *s)
+g_writer_write_indent (GIdlWriter * writer, const char *s)
{
- g_igenerator_write (igenerator, s);
- igenerator->indent++;
+ g_writer_write (writer, s);
+ writer->indent++;
}
static void
-g_igenerator_write_unindent (GIGenerator * igenerator, const char *s)
+g_writer_write_unindent (GIdlWriter * writer, const char *s)
{
- igenerator->indent--;
- g_igenerator_write (igenerator, s);
+ writer->indent--;
+ g_writer_write (writer, s);
}
static void
-field_generate (GIGenerator * igenerator, GIdlNodeField * node)
+field_generate (GIdlWriter * writer, GIdlNodeField * node)
{
char *markup =
g_markup_printf_escaped ("<field name=\"%s\" type=\"%s\"/>\n",
node->node.name, node->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
static void
-value_generate (GIGenerator * igenerator, GIdlNodeValue * node)
+value_generate (GIdlWriter * writer, GIdlNodeValue * node)
{
char *markup =
g_markup_printf_escaped ("<member name=\"%s\" value=\"%d\"/>\n",
node->node.name, node->value);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
static void
-constant_generate (GIGenerator * igenerator, GIdlNodeConstant * node)
+constant_generate (GIdlWriter * writer, GIdlNodeConstant * node)
{
char *markup =
g_markup_printf_escaped
("<constant name=\"%s\" type=\"%s\" value=\"%s\"/>\n", node->node.name,
node->type->unparsed, node->value);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
static void
-property_generate (GIGenerator * igenerator, GIdlNodeProperty * node)
+property_generate (GIdlWriter * writer, GIdlNodeProperty * node)
{
char *markup =
g_markup_printf_escaped ("<property name=\"%s\" "
node->writable ? "1" : "0",
node->construct ? "1" : "0",
node->construct_only ? "1" : "0");
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
static void
-function_generate (GIGenerator * igenerator, GIdlNodeFunction * node)
+function_generate (GIdlWriter * writer, GIdlNodeFunction * node)
{
char *markup;
const char *tag_name;
node->node.name, node->symbol);
}
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
markup =
g_markup_printf_escaped ("<return-type type=\"%s\"/>\n",
node->result->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
if (node->parameters != NULL)
{
GList *l;
- g_igenerator_write_indent (igenerator, "<parameters>\n");
+ g_writer_write_indent (writer, "<parameters>\n");
for (l = node->parameters; l != NULL; l = l->next)
{
GIdlNodeParam *param = l->data;
markup =
g_markup_printf_escaped ("<parameter name=\"%s\" type=\"%s\"/>\n",
param->node.name, param->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
- g_igenerator_write_unindent (igenerator, "</parameters>\n");
+ g_writer_write_unindent (writer, "</parameters>\n");
}
markup = g_strdup_printf ("</%s>\n", tag_name);
- g_igenerator_write_unindent (igenerator, markup);
+ g_writer_write_unindent (writer, markup);
g_free (markup);
}
static void
-vfunc_generate (GIGenerator * igenerator, GIdlNodeVFunc * node)
+vfunc_generate (GIdlWriter * writer, GIdlNodeVFunc * node)
{
char *markup =
g_markup_printf_escaped ("<vfunc name=\"%s\">\n", node->node.name);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
markup =
g_markup_printf_escaped ("<return-type type=\"%s\"/>\n",
node->result->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
if (node->parameters != NULL)
{
GList *l;
- g_igenerator_write_indent (igenerator, "<parameters>\n");
+ g_writer_write_indent (writer, "<parameters>\n");
for (l = node->parameters; l != NULL; l = l->next)
{
GIdlNodeParam *param = l->data;
markup =
g_markup_printf_escaped ("<parameter name=\"%s\" type=\"%s\"/>\n",
param->node.name, param->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
- g_igenerator_write_unindent (igenerator, "</parameters>\n");
+ g_writer_write_unindent (writer, "</parameters>\n");
}
- g_igenerator_write_unindent (igenerator, "</vfunc>\n");
+ g_writer_write_unindent (writer, "</vfunc>\n");
}
static void
-signal_generate (GIGenerator * igenerator, GIdlNodeSignal * node)
+signal_generate (GIdlWriter * writer, GIdlNodeSignal * node)
{
char *markup;
const char *when = "LAST";
markup =
g_markup_printf_escaped ("<signal name=\"%s\" when=\"%s\">\n",
node->node.name, when);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
markup =
g_markup_printf_escaped ("<return-type type=\"%s\"/>\n",
node->result->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
if (node->parameters != NULL)
{
GList *l;
- g_igenerator_write_indent (igenerator, "<parameters>\n");
+ g_writer_write_indent (writer, "<parameters>\n");
for (l = node->parameters; l != NULL; l = l->next)
{
GIdlNodeParam *param = l->data;
markup =
g_markup_printf_escaped ("<parameter name=\"%s\" type=\"%s\"/>\n",
param->node.name, param->type->unparsed);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
- g_igenerator_write_unindent (igenerator, "</parameters>\n");
+ g_writer_write_unindent (writer, "</parameters>\n");
}
- g_igenerator_write_unindent (igenerator, "</signal>\n");
+ g_writer_write_unindent (writer, "</signal>\n");
}
static void
-interface_generate (GIGenerator * igenerator, GIdlNodeInterface * node)
+interface_generate (GIdlWriter * writer, GIdlNodeInterface * node)
{
GList *l;
char *markup;
node->node.name, node->gtype_name, node->gtype_init);
}
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
if (node->node.type == G_IDL_NODE_OBJECT && node->interfaces != NULL)
{
GList *l;
- g_igenerator_write_indent (igenerator, "<implements>\n");
+ g_writer_write_indent (writer, "<implements>\n");
for (l = node->interfaces; l != NULL; l = l->next)
{
markup =
g_markup_printf_escaped ("<interface name=\"%s\"/>\n",
(char *) l->data);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
- g_igenerator_write_unindent (igenerator, "</implements>\n");
+ g_writer_write_unindent (writer, "</implements>\n");
}
else if (node->node.type == G_IDL_NODE_INTERFACE
&& node->prerequisites != NULL)
{
GList *l;
- g_igenerator_write_indent (igenerator, "<requires>\n");
+ g_writer_write_indent (writer, "<requires>\n");
for (l = node->prerequisites; l != NULL; l = l->next)
{
markup =
g_markup_printf_escaped ("<interface name=\"%s\"/>\n",
(char *) l->data);
- g_igenerator_write (igenerator, markup);
+ g_writer_write (writer, markup);
g_free (markup);
}
- g_igenerator_write_unindent (igenerator, "</requires>\n");
+ g_writer_write_unindent (writer, "</requires>\n");
}
for (l = node->members; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
if (node->node.type == G_IDL_NODE_OBJECT)
{
- g_igenerator_write_unindent (igenerator, "</object>\n");
+ g_writer_write_unindent (writer, "</object>\n");
}
else if (node->node.type == G_IDL_NODE_INTERFACE)
{
- g_igenerator_write_unindent (igenerator, "</interface>\n");
+ g_writer_write_unindent (writer, "</interface>\n");
}
}
static void
-struct_generate (GIGenerator * igenerator, GIdlNodeStruct * node)
+struct_generate (GIdlWriter * writer, GIdlNodeStruct * node)
{
GList *l;
char *markup =
g_markup_printf_escaped ("<struct name=\"%s\">\n", node->node.name);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
for (l = node->members; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
- g_igenerator_write_unindent (igenerator, "</struct>\n");
+ g_writer_write_unindent (writer, "</struct>\n");
}
static void
-union_generate (GIGenerator * igenerator, GIdlNodeUnion * node)
+union_generate (GIdlWriter * writer, GIdlNodeUnion * node)
{
GList *l;
char *markup =
g_markup_printf_escaped ("<union name=\"%s\">\n", node->node.name);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
for (l = node->members; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
- g_igenerator_write_unindent (igenerator, "</union>\n");
+ g_writer_write_unindent (writer, "</union>\n");
}
static void
-boxed_generate (GIGenerator * igenerator, GIdlNodeBoxed * node)
+boxed_generate (GIdlWriter * writer, GIdlNodeBoxed * node)
{
GList *l;
char *markup =
g_markup_printf_escaped
("<boxed name=\"%s\" type-name=\"%s\" get-type=\"%s\">\n",
node->node.name, node->gtype_name, node->gtype_init);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
for (l = node->members; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
- g_igenerator_write_unindent (igenerator, "</boxed>\n");
+ g_writer_write_unindent (writer, "</boxed>\n");
}
static void
-enum_generate (GIGenerator * igenerator, GIdlNodeEnum * node)
+enum_generate (GIdlWriter * writer, GIdlNodeEnum * node)
{
GList *l;
char *markup;
}
markup =
g_markup_printf_escaped ("<%s name=\"%s\">\n", tag_name, node->node.name);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
for (l = node->values; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
markup = g_strdup_printf ("</%s>\n", tag_name);
- g_igenerator_write_unindent (igenerator, markup);
+ g_writer_write_unindent (writer, markup);
g_free (markup);
}
static void
-node_generate (GIGenerator * igenerator, GIdlNode * node)
+node_generate (GIdlWriter * writer, GIdlNode * node)
{
switch (node->type)
{
case G_IDL_NODE_FUNCTION:
case G_IDL_NODE_CALLBACK:
- function_generate (igenerator, (GIdlNodeFunction *) node);
+ function_generate (writer, (GIdlNodeFunction *) node);
break;
case G_IDL_NODE_VFUNC:
- vfunc_generate (igenerator, (GIdlNodeVFunc *) node);
+ vfunc_generate (writer, (GIdlNodeVFunc *) node);
break;
case G_IDL_NODE_OBJECT:
case G_IDL_NODE_INTERFACE:
- interface_generate (igenerator, (GIdlNodeInterface *) node);
+ interface_generate (writer, (GIdlNodeInterface *) node);
break;
case G_IDL_NODE_STRUCT:
- struct_generate (igenerator, (GIdlNodeStruct *) node);
+ struct_generate (writer, (GIdlNodeStruct *) node);
break;
case G_IDL_NODE_UNION:
- union_generate (igenerator, (GIdlNodeUnion *) node);
+ union_generate (writer, (GIdlNodeUnion *) node);
break;
case G_IDL_NODE_BOXED:
- boxed_generate (igenerator, (GIdlNodeBoxed *) node);
+ boxed_generate (writer, (GIdlNodeBoxed *) node);
break;
case G_IDL_NODE_ENUM:
case G_IDL_NODE_FLAGS:
- enum_generate (igenerator, (GIdlNodeEnum *) node);
+ enum_generate (writer, (GIdlNodeEnum *) node);
break;
case G_IDL_NODE_PROPERTY:
- property_generate (igenerator, (GIdlNodeProperty *) node);
+ property_generate (writer, (GIdlNodeProperty *) node);
break;
case G_IDL_NODE_FIELD:
- field_generate (igenerator, (GIdlNodeField *) node);
+ field_generate (writer, (GIdlNodeField *) node);
break;
case G_IDL_NODE_SIGNAL:
- signal_generate (igenerator, (GIdlNodeSignal *) node);
+ signal_generate (writer, (GIdlNodeSignal *) node);
break;
case G_IDL_NODE_VALUE:
- value_generate (igenerator, (GIdlNodeValue *) node);
+ value_generate (writer, (GIdlNodeValue *) node);
break;
case G_IDL_NODE_CONSTANT:
- constant_generate (igenerator, (GIdlNodeConstant *) node);
+ constant_generate (writer, (GIdlNodeConstant *) node);
break;
default:
g_assert_not_reached ();
}
static void
-module_generate (GIGenerator * igenerator, GIdlModule * module)
+g_writer_write_module (GIdlWriter * writer, GIdlModule * module)
{
GList *l;
char *markup =
g_markup_printf_escaped ("<namespace name=\"%s\">\n", module->name);
- g_igenerator_write_indent (igenerator, markup);
+ g_writer_write_indent (writer, markup);
g_free (markup);
for (l = module->entries; l != NULL; l = l->next)
{
- node_generate (igenerator, l->data);
+ node_generate (writer, l->data);
}
- g_igenerator_write_unindent (igenerator, "</namespace>\n");
+ g_writer_write_unindent (writer, "</namespace>\n");
}
void
-g_scanner_write_file (GIGenerator *igenerator)
+g_idl_writer_save_file (GIdlModule *module,
+ const gchar *filename)
{
- g_igenerator_write (igenerator, "<?xml version=\"1.0\"?>\n");
- g_igenerator_write_indent (igenerator, "<api version=\"1.0\">\n");
- module_generate (igenerator, igenerator->module);
- g_igenerator_write_unindent (igenerator, "</api>\n");
+ FILE * file;
+ GIdlWriter *writer;
+
+ writer = g_new0 (GIdlWriter, 1);
+
+ if (!filename)
+ writer->output = stdout;
+ else
+ writer->output = fopen (filename, "w");
+
+ g_writer_write (writer, "<?xml version=\"1.0\"?>\n");
+ g_writer_write_indent (writer, "<api version=\"1.0\">\n");
+ g_writer_write_module (writer, module);
+ g_writer_write_unindent (writer, "</api>\n");
+
+ if (filename)
+ fclose (writer->output);
}