int
slang_variable_copy(slang_variable * x, const slang_variable * y)
{
   slang_variable z;

   if (!slang_variable_construct(&z))
      return 0;
   if (!slang_fully_specified_type_copy(&z.type, &y->type)) {
      slang_variable_destruct(&z);
      return 0;
   }
   z.a_name = y->a_name;
   z.array_len = y->array_len;
   if (y->initializer != NULL) {
      z.initializer
         = (slang_operation *) _slang_alloc(sizeof(slang_operation));
      if (z.initializer == NULL) {
         slang_variable_destruct(&z);
         return 0;
      }
      if (!slang_operation_construct(z.initializer)) {
         _slang_free(z.initializer);
         slang_variable_destruct(&z);
         return 0;
      }
      if (!slang_operation_copy(z.initializer, y->initializer)) {
         slang_variable_destruct(&z);
         return 0;
      }
   }
   z.size = y->size;
   slang_variable_destruct(x);
   *x = z;
   return 1;
}
int slang_variable_scope_copy (slang_variable_scope *x, const slang_variable_scope *y)
{
	slang_variable_scope z;
	unsigned int i;

	if (!slang_variable_scope_construct (&z))
		return 0;
	z.variables = (slang_variable *) slang_alloc_malloc (y->num_variables * sizeof (slang_variable));
	if (z.variables == NULL)
	{
		slang_variable_scope_destruct (&z);
		return 0;
	}
	for (z.num_variables = 0; z.num_variables < y->num_variables; z.num_variables++)
		if (!slang_variable_construct (&z.variables[z.num_variables]))
		{
			slang_variable_scope_destruct (&z);
			return 0;
		}
	for (i = 0; i < z.num_variables; i++)
		if (!slang_variable_copy (&z.variables[i], &y->variables[i]))
		{
			slang_variable_scope_destruct (&z);
			return 0;
		}
	z.outer_scope = y->outer_scope;
	slang_variable_scope_destruct (x);
	*x = z;
	return 1;
}
static slang_variable *
slang_variable_new(void)
{
   slang_variable *v = (slang_variable *) _slang_alloc(sizeof(slang_variable));
   if (v) {
      if (!slang_variable_construct(v)) {
         _slang_free(v);
         v = NULL;
      }
   }
   return v;
}
int slang_function_construct (slang_function *func)
{
	func->kind = slang_func_ordinary;
	if (!slang_variable_construct (&func->header))
		return 0;
	func->parameters = (slang_variable_scope *) slang_alloc_malloc (sizeof (slang_variable_scope));
	if (func->parameters == NULL)
	{
		slang_variable_destruct (&func->header);
		return 0;
	}
	if (!slang_variable_scope_construct (func->parameters))
	{
		slang_alloc_free (func->parameters);
		slang_variable_destruct (&func->header);
		return 0;
	}
	func->param_count = 0;
	func->body = NULL;
	func->address = ~0;
	slang_fixup_table_init (&func->fixups);
	return 1;
}