summaryrefslogtreecommitdiff
path: root/compiler/ex-ast.c
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-04-15 06:17:12 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-04-15 06:17:12 -0400
commit669fece3ac2ea75480ffe0e116225ff32ec54f5f (patch)
treeb695ed150d1b957e8572d351e0342187129e51cf /compiler/ex-ast.c
Initial check-inHEADmaster
Diffstat (limited to 'compiler/ex-ast.c')
-rw-r--r--compiler/ex-ast.c301
1 files changed, 301 insertions, 0 deletions
diff --git a/compiler/ex-ast.c b/compiler/ex-ast.c
new file mode 100644
index 0000000..7d67410
--- /dev/null
+++ b/compiler/ex-ast.c
@@ -0,0 +1,301 @@
+#include "ex-compiler.h"
+
+ExSpec *
+ex_spec_new (ExUsesClause *clauses,
+ ExDefinition *definitions)
+{
+ ExSpec *spec = ex_new (ExSpec, 1);
+
+ spec->uses_clauses = clauses;
+ spec->definitions = definitions;
+
+ return spec;
+}
+
+ExUsesClause *
+ex_uses_clause_new (const char *name)
+{
+ ExUsesClause *clause = ex_new (ExUsesClause, 1);
+
+ clause->name = ex_strdup (name);
+
+ return clause;
+}
+
+ExDefinition *
+ex_definition_new_namespace (ExNamespace *namespace)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_NAMESPACE;
+ definition->u.namespace = namespace;
+
+ return definition;
+}
+
+ExDefinition *
+ex_definition_new_extension (ExExtension *extension)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_EXTENSION;
+ definition->u.extension = extension;
+
+ return definition;
+}
+
+ExDefinition *
+ex_definition_new_type_def (ExTypeDef *type_def)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_TYPE_DEF;
+ definition->u.type_def = type_def;
+
+ return definition;
+}
+
+ExDefinition *
+ex_definition_new_request (ExRequest *request)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_REQUEST;
+ definition->u.request = request;
+
+ return definition;
+}
+
+ExDefinition *
+ex_definition_new_event (ExEvent *event)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_EVENT;
+ definition->u.event = event;
+
+ return definition;
+}
+
+ExDefinition *
+ex_definition_new_error (ExError *error)
+{
+ ExDefinition *definition = ex_new (ExDefinition, 1);
+
+ definition->type = EX_DEFINITION_ERROR;
+ definition->u.error = error;
+
+ return definition;
+}
+
+ExNamespace *
+ex_namespace_new (const char *name,
+ ExDefinition *definitions)
+{
+ ExNamespace *namespace = ex_new (ExNamespace, 1);
+
+#if 0
+ printf ("namespace: %s\n", name);
+#endif
+
+ namespace->name = ex_strdup (name);
+ namespace->definitions = definitions;
+
+ return namespace;
+}
+
+ExExtension *
+ex_extension_new (const char *name,
+ ExDefinition *definitions)
+{
+ ExExtension *extension = ex_new (ExExtension, 1);
+
+ extension->name = ex_strdup (name);
+ extension->definitions = definitions;
+
+ return extension;
+}
+
+ExTypeDef *
+ex_type_def_new (const char *name,
+ ExType *type)
+{
+ ExTypeDef *type_def = ex_new (ExTypeDef, 1);
+
+ type_def->name = ex_strdup (name);
+ type_def->type = type;
+
+ return type_def;
+}
+
+ExType *
+ex_type_new_enum (ExIdentifier *identifiers)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_ENUM;
+ type->u._enum.identifiers = identifiers;
+
+ return type;
+}
+
+ExType *
+ex_type_new_struct (ExField *fields)
+{
+ ExType *type = ex_new (ExType, 1);
+
+#if 0
+ printf ("fields: %p\n", fields);
+#endif
+
+ type->type = EX_TYPE_STRUCT;
+ type->u._struct.fields = fields;
+
+ return type;
+}
+
+ExType *
+ex_type_bits_new (unsigned long mask,
+ ExIdentifier *identifiers)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_BITS;
+ type->u.bits.mask = mask;
+ type->u.bits.fields = identifiers;
+
+ return type;
+}
+
+ExType *
+ex_type_derived_bits_new (const char *name,
+ unsigned long mask)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_DERIVED_BITS;
+ type->u.derived_bits.derived_from_name = ex_strdup (name);
+ type->u.derived_bits.mask = mask;
+
+ return type;
+}
+
+ExType *
+ex_type_masked_list_new (ExField *fields)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_MASKED_LIST;
+ type->u.masked_list.fields = fields;
+
+ return type;
+}
+
+ExType *
+ex_type_identifier_new (const char *name,
+ exboolean can_be_null)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_IDENTIFIER;
+ type->u.identifier.name = ex_strdup (name);
+ type->u.identifier.can_be_null = can_be_null;
+
+ return type;
+}
+
+ExType *
+ex_type_union_new (ExField *fields)
+{
+ ExType *type = ex_new (ExType, 1);
+
+ type->type = EX_TYPE_UNION;
+ type->u._union.fields = fields;
+
+ return type;
+}
+
+ExType *
+ex_type_list_new (ExType *type)
+{
+ ExType *new_type = ex_new (ExType, 1);
+
+ new_type->type = EX_TYPE_LIST;
+ new_type->u._list.type = type;
+
+ return type;
+}
+
+ExType *
+ex_type_basic_new (ExTypeType type)
+{
+ ExType *new_type = ex_new (ExType, 1);
+
+ new_type->type = type;
+
+ return new_type;
+}
+
+ExIdentifier *
+ex_identifier_new (const char *name)
+{
+ ExIdentifier *id = ex_new (ExIdentifier, 1);
+
+ id->name = ex_strdup (name);
+
+ return id;
+}
+
+ExError *
+ex_error_new (const char *name)
+{
+ ExError *error = ex_new (ExError, 1);
+
+ error->name = ex_strdup (name);
+
+ return error;
+}
+
+ExField *
+ex_field_new (ExType *type,
+ const char *name,
+ exboolean is_created)
+{
+ ExField *field = ex_new (ExField, 1);
+
+ field->type = type;
+ field->name = ex_strdup (name);
+ field->is_created = is_created;
+
+ return field;
+}
+
+ExRequest *
+ex_request_new (const char *name,
+ int opcode,
+ ExField *parameters,
+ ExField *reply,
+ ExIdentifier *errors)
+{
+ ExRequest *request = ex_new (ExRequest, 1);
+
+ request->opcode = opcode;
+ request->name = ex_strdup (name);
+ request->parameters = parameters;
+ request->reply = reply;
+ request->errors = errors;
+
+ return request;
+}
+
+ExEvent *
+ex_event_new (const char *name,
+ ExField *fields)
+{
+ ExEvent *event = ex_new (ExEvent, 1);
+
+ event->name = ex_strdup (name);
+ event->fields = fields;
+
+ return event;
+}