Example #1
0
        void append_struct(CCodeStruct structure)
        {
            var typename = new CCodeVariableDeclarator(structure.name.Substring(1));
            var typedef  = new CCodeTypeDefinition("struct " + structure.name, typename);

            cfile.add_type_declaration(typedef);
            cfile.add_type_definition(structure);
        }
Example #2
0
        public override void generate_delegate_declaration(ValaDelegate d, CCodeFile decl_space)
        {
            if (add_symbol_declaration(decl_space, d, get_ccode_name(d)))
            {
                return;
            }

            string return_type_cname = get_ccode_name(d.return_type);

            if (d.return_type.is_real_non_null_struct_type())
            {
                // structs are returned via out parameter
                return_type_cname = "void";
            }

            if (return_type_cname == get_ccode_name(d))
            {
                // recursive delegate
                return_type_cname = "GCallback";
            }
            else
            {
                generate_type_declaration(d.return_type, decl_space);
            }

            var cfundecl = new CCodeFunctionDeclarator(get_ccode_name(d));

            foreach (Parameter param in d.get_parameters())
            {
                var cparam = generate_parameter(param, decl_space, new Dictionary <int, CCodeParameter>(), null);

                cfundecl.add_parameter(cparam);

                // handle array parameters
                if (get_ccode_array_length(param) && param.variable_type is ArrayType)
                {
                    var array_type = (ArrayType)param.variable_type;

                    var length_ctype = "int";
                    if (param.direction != ParameterDirection.IN)
                    {
                        length_ctype = "int*";
                    }

                    for (int dim = 1; dim <= array_type.rank; dim++)
                    {
                        cparam = new CCodeParameter(get_parameter_array_length_cname(param, dim), length_ctype);
                        cfundecl.add_parameter(cparam);
                    }
                }
                // handle delegate parameters
                if (param.variable_type is DelegateType)
                {
                    var deleg_type = (DelegateType)param.variable_type;
                    var param_d    = deleg_type.delegate_symbol;
                    if (param_d.has_target)
                    {
                        cparam = new CCodeParameter(get_delegate_target_cname(get_variable_cname(param.name)), "void*");
                        cfundecl.add_parameter(cparam);
                        if (deleg_type.is_disposable())
                        {
                            cparam = new CCodeParameter(get_delegate_target_destroy_notify_cname(get_variable_cname(param.name)), "GDestroyNotify*");
                            cfundecl.add_parameter(cparam);
                        }
                    }
                }
            }
            if (get_ccode_array_length(d) && d.return_type is ArrayType)
            {
                // return array length if appropriate
                var array_type        = (ArrayType)d.return_type;
                var array_length_type = get_ccode_array_length_type(d) != null?get_ccode_array_length_type(d) : "int";

                array_length_type += "*";

                for (int dim = 1; dim <= array_type.rank; dim++)
                {
                    var cparam = new CCodeParameter(get_array_length_cname("result", dim), array_length_type);
                    cfundecl.add_parameter(cparam);
                }
            }
            else if (d.return_type is DelegateType)
            {
                // return delegate target if appropriate
                var deleg_type = (DelegateType)d.return_type;
                var result_d   = deleg_type.delegate_symbol;
                if (result_d.has_target)
                {
                    var cparam = new CCodeParameter(get_delegate_target_cname("result"), "void**");
                    cfundecl.add_parameter(cparam);
                    if (deleg_type.is_disposable())
                    {
                        cparam = new CCodeParameter(get_delegate_target_destroy_notify_cname("result"), "GDestroyNotify*");
                        cfundecl.add_parameter(cparam);
                    }
                }
            }
            else if (d.return_type.is_real_non_null_struct_type())
            {
                var cparam = new CCodeParameter("result", "%s*".printf(get_ccode_name(d.return_type)));
                cfundecl.add_parameter(cparam);
            }
            if (d.has_target)
            {
                var cparam = new CCodeParameter("user_data", "void*");
                cfundecl.add_parameter(cparam);
            }
            if (d.get_error_types().Count > 0)
            {
                var cparam = new CCodeParameter("error", "GError**");
                cfundecl.add_parameter(cparam);
            }

            var ctypedef = new CCodeTypeDefinition(return_type_cname, cfundecl);

            ctypedef.modifiers |= (d.version.deprecated ? CCodeModifiers.DEPRECATED : 0);

            decl_space.add_type_definition(ctypedef);
        }