summaryrefslogtreecommitdiff
path: root/compiler/ex-pretty.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/ex-pretty.c')
-rw-r--r--compiler/ex-pretty.c256
1 files changed, 256 insertions, 0 deletions
diff --git a/compiler/ex-pretty.c b/compiler/ex-pretty.c
new file mode 100644
index 0000000..e7888c2
--- /dev/null
+++ b/compiler/ex-pretty.c
@@ -0,0 +1,256 @@
+#include "ex-compiler.h"
+#include <stdio.h>
+
+static void dump_uses_clause (ExUsesClause *clause);
+static void dump_definition (ExDefinition *definition);
+static void dump_namespace (ExNamespace *namespace);
+static void dump_extension (ExExtension *extension);
+static void dump_request (ExRequest *request);
+static void dump_event (ExEvent *event);
+static void dump_type_def (ExTypeDef *type_def);
+static void dump_identifier (ExIdentifier *identifier);
+static void dump_type (ExType *type);
+static void dump_field (ExField *field);
+static void dump_error (ExError *error);
+
+void
+ex_dump (ExSpec *spec)
+{
+ if (!spec)
+ return;
+
+ dump_uses_clause (spec->uses_clauses);
+ dump_definition (spec->definitions);
+}
+
+static void
+dump_uses_clause (ExUsesClause *clause)
+{
+ if (!clause)
+ return;
+
+ printf ("uses %s;\n", clause->name);
+ dump_uses_clause (clause->next);
+ printf ("\n");
+}
+
+static void
+dump_definition (ExDefinition *definition)
+{
+ if (!definition)
+ return;
+
+ switch (definition->type)
+ {
+ case EX_DEFINITION_NAMESPACE:
+ dump_namespace (definition->u.namespace);
+ break;
+
+ case EX_DEFINITION_EXTENSION:
+ dump_extension (definition->u.extension);
+ break;
+
+ case EX_DEFINITION_REQUEST:
+ dump_request (definition->u.request);
+ break;
+
+ case EX_DEFINITION_TYPE_DEF:
+ dump_type_def (definition->u.type_def);
+ break;
+
+ case EX_DEFINITION_ERROR:
+ dump_error (definition->u.error);
+ break;
+
+ case EX_DEFINITION_EVENT:
+ dump_event (definition->u.event);
+ break;
+ }
+
+ dump_definition (definition->next);
+}
+
+static void
+dump_namespace (ExNamespace *namespace)
+{
+ if (!namespace)
+ return;
+
+ printf ("namespace %s {\n", namespace->name);
+ dump_definition (namespace->definitions);
+ printf ("}\n");
+}
+
+static void
+dump_extension (ExExtension *extension)
+{
+ if (!extension)
+ return;
+
+ printf ("extension %s {\n", extension->name);
+ dump_definition (extension->definitions);
+ printf ("\n");
+}
+
+static void
+dump_request (ExRequest *request)
+{
+ if (!request)
+ return;
+
+ printf ("request %s = {\n", request->name);
+ dump_field (request->parameters);
+ printf ("reply:\n");
+ dump_field (request->reply);
+ printf ("errors:\n");
+ dump_identifier (request->errors);
+ printf ("}\n");
+}
+
+static void
+dump_type_def (ExTypeDef *type_def)
+{
+ if (!type_def)
+ return;
+
+ printf ("type %s = ", type_def->name);
+ dump_type (type_def->type);
+}
+
+static void
+dump_error (ExError *error)
+{
+ if (!error)
+ return;
+
+ printf ("error %s;\n", error->name);
+}
+
+static void
+dump_event (ExEvent *event)
+{
+ if (!event)
+ return;
+
+ printf ("event %s {\n", event->name);
+ dump_field (event->fields);
+ printf ("}\n");
+}
+
+static void
+dump_identifier (ExIdentifier *identifier)
+{
+ if (!identifier)
+ return;
+
+ printf ("%s,\n", identifier->name);
+ dump_identifier (identifier->next);
+}
+
+static void
+dump_type (ExType *type)
+{
+ if (!type)
+ return;
+
+ switch (type->type)
+ {
+ case EX_TYPE_CARD8:
+ printf ("card8\n");
+ break;
+
+ case EX_TYPE_CARD16:
+ printf ("card16\n");
+ break;
+
+ case EX_TYPE_CARD32:
+ printf ("card32\n");
+ break;
+
+ case EX_TYPE_CARD64:
+ printf ("card64\n");
+ break;
+
+ case EX_TYPE_INT8:
+ printf ("int8\n");
+ break;
+
+ case EX_TYPE_INT16:
+ printf ("int16\n");
+ break;
+
+ case EX_TYPE_INT32:
+ printf ("int32\n");
+ break;
+
+ case EX_TYPE_INT64:
+ printf ("int64\n");
+ break;
+
+ case EX_TYPE_BOOLEAN:
+ printf ("boolean\n");
+ break;
+
+ case EX_TYPE_ENUM:
+ printf ("enum {\n");
+ dump_identifier (type->u._enum.identifiers);
+ printf ("}");
+ break;
+
+ case EX_TYPE_STRUCT:
+ printf ("struct {\n");
+ dump_field (type->u._struct.fields);
+ printf ("}\n");
+ break;
+
+ case EX_TYPE_BITS:
+ printf ("bits {\n");
+ dump_identifier (type->u.bits.fields);
+ printf ("}\n");
+ break;
+
+ case EX_TYPE_DERIVED_BITS:
+ printf ("%s [%8lx];\n", type->u.derived_bits.derived_from_name,
+ type->u.derived_bits.mask);
+ break;
+
+ case EX_TYPE_MASKED_LIST:
+ printf ("masked_list {\n");
+ dump_field (type->u.masked_list.fields);
+ printf ("}\n");
+ break;
+
+ case EX_TYPE_IDENTIFIER:
+ printf ("%s%s\n",
+ type->u.identifier.name,
+ type->u.identifier.can_be_null? "?" : "");
+ break;
+
+ case EX_TYPE_UNION:
+ printf ("union {\n");
+ dump_field (type->u._struct.fields);
+ printf ("}\n");
+ break;
+
+ case EX_TYPE_LIST:
+ printf ("list [\n");
+ dump_type (type->u._list.type);
+ printf ("]\n");
+ break;
+
+ case EX_TYPE_XID:
+ printf ("xid\n");
+ break;
+ }
+}
+
+static void
+dump_field (ExField *field)
+{
+ if (!field)
+ return;
+
+ dump_type (field->type);
+ printf ("%s%s;\n", field->name, field->is_created? "*" : "");
+ dump_field (field->next);
+}