diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-04-15 06:17:12 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-04-15 06:17:12 -0400 |
commit | 669fece3ac2ea75480ffe0e116225ff32ec54f5f (patch) | |
tree | b695ed150d1b957e8572d351e0342187129e51cf /compiler/ex-pretty.c |
Diffstat (limited to 'compiler/ex-pretty.c')
-rw-r--r-- | compiler/ex-pretty.c | 256 |
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); +} |