3 #include "forb-idl-c-backend.h"
6 #include "forb_config.h"
9 ci_build_interfaces (OIDL_C_Info *ci,
15 switch (IDL_NODE_TYPE (tree)) {
18 ci, IDL_MODULE (tree).definition_list);
22 for (sub = tree; sub; sub = IDL_LIST (sub).next)
24 ci, IDL_LIST (sub).data);
27 case IDLN_INTERFACE: {
30 id = IDL_ns_ident_to_qstring (IDL_IDENT_TO_NS (
31 IDL_INTERFACE (tree).ident), "_", 0);
33 fprintf (ci->fh, "\t&%s__iinterface,\n", id);
38 ci, IDL_INTERFACE(tree).body);
47 ci_build_types (OIDL_C_Info *ci,
54 switch (IDL_NODE_TYPE (tree)) {
57 ci, IDL_MODULE (tree).definition_list, count);
61 for (sub = tree; sub; sub = IDL_LIST (sub).next)
63 ci, IDL_LIST (sub).data, count);
68 ci, IDL_INTERFACE(tree).body, count);
72 for (sub = IDL_TYPE_DCL (tree).dcls; sub; sub = IDL_LIST (sub).next) {
73 IDL_tree ent = IDL_LIST (sub).data;
76 id = forb_cbe_get_typespec_str (ent);
78 fprintf (ci->fh, "\tTC_%s,\n", id);
86 case IDLN_TYPE_STRUCT: {
90 id = forb_cbe_get_typespec_str (tree);
92 fprintf (ci->fh, "\tTC_%s,\n", id);
97 /* check for nested structs/enums */
98 for (l = IDL_TYPE_STRUCT (tree).member_list; l; l = IDL_LIST (l).next) {
101 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_MEMBER);
102 dcl = IDL_MEMBER (IDL_LIST (l).data).type_spec;
104 /* skip straight declarations */
105 if (IDL_NODE_TYPE(dcl) == IDLN_TYPE_STRUCT ||
106 IDL_NODE_TYPE(dcl) == IDLN_TYPE_UNION ||
107 IDL_NODE_TYPE(dcl) == IDLN_TYPE_ENUM)
108 ci_build_types (ci, dcl, count);
112 case IDLN_TYPE_UNION: {
116 id = forb_cbe_get_typespec_str (tree);
118 fprintf (ci->fh, "\tTC_%s,\n", id);
123 /* if discriminator is an enum, register it */
124 if (IDL_NODE_TYPE (IDL_TYPE_UNION (tree).switch_type_spec) == IDLN_TYPE_ENUM)
126 ci, IDL_TYPE_UNION (tree).switch_type_spec, count);
128 /* check for nested structs/enums */
129 for (l = IDL_TYPE_UNION (tree).switch_body; l; l = IDL_LIST (l).next) {
132 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_CASE_STMT);
134 IDL_CASE_STMT (IDL_LIST (l).data).element_spec).type_spec;
136 if (IDL_NODE_TYPE(dcl) == IDLN_TYPE_STRUCT ||
137 IDL_NODE_TYPE(dcl) == IDLN_TYPE_UNION ||
138 IDL_NODE_TYPE(dcl) == IDLN_TYPE_ENUM)
139 ci_build_types (ci, dcl, count);
143 case IDLN_EXCEPT_DCL: {
147 id = forb_cbe_get_typespec_str (tree);
149 fprintf (ci->fh, "\tTC_%s,\n", id);
154 /* check for nested structs/enums */
155 for (l = IDL_EXCEPT_DCL (tree).members; l; l = IDL_LIST (l).next) {
158 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_MEMBER);
159 dcl = IDL_MEMBER (IDL_LIST (l).data).type_spec;
161 /* skip straight declarations */
162 if (IDL_NODE_TYPE(dcl) == IDLN_TYPE_STRUCT ||
163 IDL_NODE_TYPE(dcl) == IDLN_TYPE_UNION ||
164 IDL_NODE_TYPE(dcl) == IDLN_TYPE_ENUM)
165 ci_build_types (ci, dcl, count);
169 case IDLN_TYPE_INTEGER:
171 case IDLN_TYPE_STRING:
172 case IDLN_TYPE_WIDE_STRING:
174 case IDLN_TYPE_WIDE_CHAR:
175 case IDLN_TYPE_FLOAT:
176 case IDLN_TYPE_BOOLEAN:
177 case IDLN_TYPE_OCTET:
178 case IDLN_TYPE_SEQUENCE:
181 case IDLN_FORWARD_DCL:
182 case IDLN_TYPE_OBJECT: {
185 id = forb_cbe_get_typespec_str (tree);
187 fprintf (ci->fh, "\tTC_%s,\n", id);
200 forb_idl_output_c_imodule (IDL_tree tree,
201 OIDL_Run_Info *rinfo,
206 fprintf (ci->fh, OIDL_C_WARNING);
207 fprintf (ci->fh, "#include <string.h>\n");
208 fprintf (ci->fh, "#define FORB_IDL_C_IMODULE_%s\n\n",ci->c_base_name);
210 fprintf (ci->fh, "#include \"%s-common.c\"\n\n", ci->base_name);
212 fprintf (ci->fh, "#include <forb/orb-core/forb-small.h>\n\n");
214 fprintf (ci->fh, "static CORBA_TypeCode %s__itypes[] = {\n",
218 ci_build_types (ci, tree, &count);
220 fprintf (ci->fh, "\tNULL\n};\n\n");
222 fprintf (ci->fh, "static Forb_IInterface *%s__iinterfaces[] = {\n",
225 ci_build_interfaces (ci, tree);
227 fprintf (ci->fh, "\tNULL\n};\n");
229 fprintf (ci->fh, "Forb_IModule forb_imodule_data = {\n");
230 fprintf (ci->fh, " %d,\n", FORB_CONFIG_SERIAL);
231 fprintf (ci->fh, " %s__iinterfaces,\n", ci->c_base_name);
232 fprintf (ci->fh, " { %u, %u, %s__itypes, FALSE }\n",
233 count, count, ci->c_base_name);
234 fprintf (ci->fh, "};\n\n");