1 #include "forb-idl-c-backend.h"
13 static int random_id = 0;
15 static char *forb_generate_tcstruct_name (IDL_tree ts);
16 static void cbe_tc_generate (OIDL_C_Info *ci, CBETCGenInfo *tci);
19 forb_output_typecode (OIDL_C_Info *ci,
24 switch (IDL_NODE_TYPE (node)) {
26 case IDLN_TYPE_STRUCT:
30 case IDLN_TYPE_SEQUENCE:
34 g_error ("You can't produce a typecode for a %s",
35 IDL_tree_type_names[IDL_NODE_TYPE (node)]);
39 tci.structname = forb_generate_tcstruct_name (node);
40 tci.substructname = NULL;
41 tci.array_gen_ctr = 0;
43 cbe_tc_generate (ci, &tci);
45 g_free (tci.structname);
49 forb_generate_tcstruct_name (IDL_tree node)
54 tmpstr = g_string_new (NULL);
56 switch (IDL_NODE_TYPE (node)) {
57 case IDLN_TYPE_INTEGER:
59 case IDLN_TYPE_STRING:
60 case IDLN_TYPE_WIDE_STRING:
62 case IDLN_TYPE_WIDE_CHAR:
64 case IDLN_TYPE_BOOLEAN:
66 case IDLN_TYPE_SEQUENCE:
67 case IDLN_TYPE_STRUCT:
73 case IDLN_FORWARD_DCL:
74 case IDLN_TYPE_OBJECT: {
75 char *typespec = forb_cbe_get_typespec_str (node);
77 g_string_printf (tmpstr, "TC_%s", typespec);
83 g_string_printf (tmpstr, "anonTC_%d", random_id++);
88 g_string_free (tmpstr, FALSE);
94 forb_output_tcstruct_anon_subnames_array (FILE *fh, IDL_tree node, int subnames_id)
98 switch (IDL_NODE_TYPE (node)) {
100 if (!IDL_TYPE_ENUM (node).enumerator_list)
103 fprintf (fh, "static const char *anon_subnames_array%d[] = {", subnames_id);
105 for (l = IDL_TYPE_ENUM (node).enumerator_list; l; l = IDL_LIST (l).next) {
106 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_IDENT);
108 fprintf (fh, "\"%s\"", IDL_IDENT (IDL_LIST (l).data).str );
109 if (IDL_LIST (l).next)
113 fprintf (fh, "};\n");
115 case IDLN_EXCEPT_DCL:
116 case IDLN_TYPE_STRUCT:
117 if (!IDL_TYPE_STRUCT (node).member_list)
120 fprintf (fh, "static const char *anon_subnames_array%d[] = {", subnames_id);
122 for (l = IDL_TYPE_STRUCT (node).member_list; l; l = IDL_LIST (l).next) {
125 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_MEMBER);
127 for (dcl = IDL_MEMBER (IDL_LIST (l).data).dcls; dcl;
128 dcl = IDL_LIST (dcl).next) {
129 IDL_tree p = IDL_LIST (dcl).data;
131 g_assert (IDL_NODE_TYPE (p) == IDLN_IDENT ||
132 IDL_NODE_TYPE (p) == IDLN_TYPE_ARRAY);
134 if (IDL_NODE_TYPE (p) == IDLN_IDENT)
135 fprintf (fh, "\"%s\"", IDL_IDENT (p).str);
137 else /* IDLN_TYPE_ARRAY */
138 fprintf (fh, "\"%s\"",
139 IDL_IDENT (IDL_TYPE_ARRAY (p).ident).str);
141 if (IDL_LIST (dcl).next || IDL_LIST (l).next)
146 fprintf (fh, "};\n");
148 case IDLN_TYPE_UNION:
149 if (!IDL_TYPE_UNION (node).switch_body)
152 fprintf (fh, "static const char * anon_subnames_array%d[] = {", subnames_id);
154 for (l = IDL_TYPE_UNION (node).switch_body; l; l = IDL_LIST (l).next) {
158 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_CASE_STMT);
160 dcl = IDL_LIST (IDL_MEMBER (
161 IDL_CASE_STMT (IDL_LIST (l).data).element_spec).dcls).data;
163 g_assert (IDL_NODE_TYPE (dcl) == IDLN_IDENT ||
164 IDL_NODE_TYPE (dcl) == IDLN_TYPE_ARRAY);
166 if (IDL_NODE_TYPE (dcl) == IDLN_IDENT)
167 subname = IDL_IDENT (dcl).str;
168 else /* IDLN_TYPE_ARRAY */
169 subname = IDL_IDENT (IDL_TYPE_ARRAY (dcl).ident).str;
171 /* output the name once for each label */
172 for (label = IDL_CASE_STMT (IDL_LIST (l).data).labels;
173 label != NULL; label = IDL_LIST (label).next) {
174 fprintf (fh, "\"%s\"", subname);
175 if (IDL_LIST (label).next)
179 if (IDL_LIST (l).next)
182 fprintf (fh, "};\n");
190 forb_output_tcstruct_anon_subtypes_array (FILE *fh,
197 switch (IDL_NODE_TYPE (node)) {
198 case IDLN_EXCEPT_DCL:
199 case IDLN_TYPE_STRUCT:
200 if (!IDL_TYPE_STRUCT (node).member_list)
203 fprintf (fh, "static FORB2_MAYBE_CONST CORBA_TypeCode anon_subtypes_array%d[] = {",
206 for (l = IDL_TYPE_STRUCT (node).member_list; l; l = IDL_LIST (l).next) {
210 dcl = IDL_MEMBER (IDL_LIST (l).data).type_spec;
212 switch (IDL_NODE_TYPE (dcl)) {
215 case IDLN_TYPE_OBJECT:
216 case IDLN_FORWARD_DCL:
217 dcl = forb_cbe_get_typespec (dcl);
219 if (IDL_NODE_DECLSPEC (dcl) & IDLF_DECLSPEC_PIDL &&
220 (IDL_NODE_TYPE (dcl) == IDLN_INTERFACE ||
221 IDL_NODE_TYPE (dcl) == IDLN_FORWARD_DCL))
222 tmpstr = g_strdup ("Object");
224 tmpstr = forb_cbe_get_typespec_str (
225 IDL_MEMBER (IDL_LIST (l).data).type_spec);
228 tmpstr = forb_cbe_get_typespec_str (
229 IDL_MEMBER (IDL_LIST (l).data).type_spec);
233 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_MEMBER);
235 for (dcl = IDL_MEMBER (IDL_LIST (l).data).dcls; dcl;
236 dcl = IDL_LIST (dcl).next) {
238 fprintf (fh, "(CORBA_TypeCode)&TC_%s_struct", tmpstr);
240 if (IDL_LIST (dcl).next || IDL_LIST (l).next)
247 fprintf (fh, "};\n");
250 case IDLN_TYPE_UNION:
251 if (!IDL_TYPE_UNION (node).switch_body)
254 fprintf (fh, "static FORB2_MAYBE_CONST CORBA_TypeCode anon_subtypes_array%d[] = {", subtypes_id);
256 for (l = IDL_TYPE_UNION (node).switch_body; l; l = IDL_LIST (l).next) {
260 g_assert (IDL_NODE_TYPE (IDL_LIST (l).data) == IDLN_CASE_STMT);
262 dcl = IDL_MEMBER (IDL_CASE_STMT (IDL_LIST (l).data).element_spec).type_spec;
264 switch (IDL_NODE_TYPE (forb_cbe_get_typespec (dcl))) {
266 case IDLN_FORWARD_DCL:
267 if (IDL_NODE_DECLSPEC (dcl) & IDLF_DECLSPEC_PIDL)
268 tmpstr = g_strdup ( "Object");
270 tmpstr = forb_cbe_get_typespec_str (dcl);
273 tmpstr = forb_cbe_get_typespec_str (dcl);
277 for (label = IDL_CASE_STMT (IDL_LIST (l).data).labels; label;
278 label = IDL_LIST (label).next) {
279 fprintf (fh, "(CORBA_TypeCode)&TC_%s_struct", tmpstr);
281 if (IDL_LIST (label).next || IDL_LIST (l).next)
288 fprintf (fh, "};\n");
291 case IDLN_TYPE_SEQUENCE: {
295 seqts = forb_cbe_get_typespec (IDL_TYPE_SEQUENCE (node).simple_type_spec);
297 fprintf (fh, "static FORB2_MAYBE_CONST CORBA_TypeCode anon_subtypes_array%d[] = ", subtypes_id);
299 switch (IDL_NODE_TYPE (seqts)) {
301 case IDLN_FORWARD_DCL:
302 if (IDL_NODE_DECLSPEC (seqts) && IDLF_DECLSPEC_PIDL)
303 tmpstr = g_strdup ("Object");
305 tmpstr = forb_cbe_get_typespec_str (
306 IDL_TYPE_SEQUENCE (node).simple_type_spec);
309 tmpstr = forb_cbe_get_typespec_str (
310 IDL_TYPE_SEQUENCE (node).simple_type_spec);
314 fprintf (fh, "{(CORBA_TypeCode)&TC_%s_struct};\n", tmpstr);
319 case IDLN_TYPE_ARRAY:
321 fprintf (fh, "static FORB2_MAYBE_CONST CORBA_TypeCode anon_subtypes_array%d[] = ", subtypes_id);
322 fprintf (fh, "{(CORBA_TypeCode)&%s_struct};\n", substructname);
330 forb_output_tcstruct_anon_sublabels_array (FILE *fh,
336 int default_index = -1;
338 if (IDL_NODE_TYPE (node) != IDLN_TYPE_UNION ||
339 !IDL_TYPE_UNION (node).switch_body)
340 return default_index;
342 fprintf (fh, "static FORB2_MAYBE_CONST CORBA_long anon_sublabels_array%d[] = {", sublabels_id);
344 for (l = IDL_TYPE_UNION (node).switch_body; l; l = IDL_LIST (l).next)
345 for (label = IDL_CASE_STMT (IDL_LIST (l).data).labels; label;
346 label = IDL_LIST (label).next, index++) {
348 if (IDL_LIST (label).data) {
349 fprintf (fh, "(CORBA_long) ");
351 forb_cbe_write_const (fh, IDL_LIST (label).data);
353 } else { /* default case */
355 default_index = index;
358 if (IDL_LIST (label).next || IDL_LIST (l).next)
362 fprintf (fh, "};\n");
364 return default_index;
368 forb_output_tcstruct_parent (FILE *fh)
370 fprintf (fh, "{&Forb_TypeCode_epv, FORB_REFCOUNT_STATIC}");
374 forb_output_tcstruct_kind (FILE *fh, IDL_tree node, int array_gen_ctr)
376 switch (IDL_NODE_TYPE (node)) {
377 case IDLN_TYPE_ARRAY:
379 fprintf (fh, "CORBA_tk_array");
381 fprintf (fh, "CORBA_tk_alias");
384 fprintf (fh, "CORBA_tk_alias");
386 case IDLN_TYPE_STRUCT:
387 fprintf (fh, "CORBA_tk_struct");
389 case IDLN_TYPE_UNION:
390 fprintf (fh, "CORBA_tk_union");
393 fprintf (fh, "CORBA_tk_enum");
395 case IDLN_TYPE_OBJECT:
397 case IDLN_FORWARD_DCL:
398 fprintf (fh, "CORBA_tk_objref");
400 case IDLN_EXCEPT_DCL:
401 fprintf (fh, "CORBA_tk_except");
403 case IDLN_TYPE_INTEGER:
404 fprintf (fh, "CORBA_tk_");
406 if (!IDL_TYPE_INTEGER (node).f_signed)
409 switch (IDL_TYPE_INTEGER (node).f_type) {
410 case IDL_INTEGER_TYPE_SHORT:
411 fprintf (fh, "short");
413 case IDL_INTEGER_TYPE_LONG:
414 fprintf (fh, "long");
416 case IDL_INTEGER_TYPE_LONGLONG:
417 fprintf (fh, "longlong");
421 case IDLN_TYPE_FLOAT:
422 fprintf (fh, "CORBA_tk_");
424 switch (IDL_TYPE_FLOAT (node).f_type) {
425 case IDL_FLOAT_TYPE_FLOAT:
426 fprintf (fh, "float");
428 case IDL_FLOAT_TYPE_DOUBLE:
429 fprintf (fh, "double");
431 case IDL_FLOAT_TYPE_LONGDOUBLE:
432 fprintf (fh, "longdouble");
436 case IDLN_TYPE_BOOLEAN:
437 fprintf (fh, "CORBA_tk_boolean");
439 case IDLN_TYPE_OCTET:
440 fprintf (fh, "CORBA_tk_octet");
442 case IDLN_TYPE_STRING:
443 fprintf (fh, "CORBA_tk_string");
445 case IDLN_TYPE_WIDE_STRING:
446 fprintf (fh, "CORBA_tk_wstring");
449 fprintf (fh, "CORBA_tk_char");
451 case IDLN_TYPE_WIDE_CHAR:
452 fprintf (fh, "CORBA_tk_wchar");
455 fprintf (fh, "CORBA_tk_any");
457 case IDLN_TYPE_SEQUENCE:
458 fprintf (fh, "CORBA_tk_sequence");
461 g_message ("Type %s has no tk constant!",
462 IDL_tree_type_names[IDL_NODE_TYPE (node)]);
467 forb_output_tcstruct_name (FILE *fh, IDL_tree node, int array_gen_ctr)
469 switch (IDL_NODE_TYPE (node)) {
470 case IDLN_TYPE_STRUCT:
471 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_STRUCT (node).ident).str);
473 case IDLN_TYPE_UNION:
474 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_UNION (node).ident).str);
477 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_ENUM (node).ident).str);
480 case IDLN_FORWARD_DCL:
481 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_INTERFACE (node).ident).str);
483 case IDLN_EXCEPT_DCL:
484 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_EXCEPT_DCL (node).ident).str);
487 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (node).str);
489 case IDLN_TYPE_ARRAY:
491 fprintf (fh, "(char *)\"%s\"",
492 IDL_IDENT (IDL_TYPE_ARRAY (node).ident).str);
494 fprintf (fh, "NULL");
497 fprintf (fh, "NULL");
503 forb_output_tcstruct_repo_id (FILE *fh, IDL_tree node, int array_gen_ctr)
505 switch (IDL_NODE_TYPE (node)) {
506 case IDLN_TYPE_STRUCT:
507 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_STRUCT (node).ident).repo_id);
509 case IDLN_TYPE_UNION:
510 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_UNION (node).ident).repo_id);
513 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_ENUM (node).ident).repo_id);
516 case IDLN_FORWARD_DCL:
517 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_INTERFACE (node).ident).repo_id);
519 case IDLN_EXCEPT_DCL:
520 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_EXCEPT_DCL (node).ident).repo_id);
523 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (node).repo_id);
525 case IDLN_TYPE_ARRAY:
527 fprintf (fh, "(char *)\"%s\"", IDL_IDENT (IDL_TYPE_ARRAY (node).ident).repo_id);
529 fprintf (fh, "NULL");
532 fprintf (fh, "NULL");
538 forb_output_tcstruct_length (FILE *fh, IDL_tree node, int array_gen_ctr)
542 switch (IDL_NODE_TYPE (node)) {
543 case IDLN_TYPE_SEQUENCE:
544 if (IDL_TYPE_SEQUENCE (node).positive_int_const)
545 length = IDL_INTEGER (IDL_TYPE_SEQUENCE (node).positive_int_const).value;
547 case IDLN_TYPE_STRING:
548 if (IDL_TYPE_STRING (node).positive_int_const)
549 length = IDL_INTEGER (IDL_TYPE_STRING (node).positive_int_const).value;
551 case IDLN_TYPE_WIDE_STRING:
552 if (IDL_TYPE_WIDE_STRING (node).positive_int_const)
553 length = IDL_INTEGER (IDL_TYPE_STRING (node).positive_int_const).value;
555 case IDLN_TYPE_ARRAY:
559 sizer = IDL_list_nth (IDL_TYPE_ARRAY (node).size_list,
562 g_assert (IDL_NODE_TYPE (IDL_LIST (sizer).data) == IDLN_INTEGER);
564 length = IDL_INTEGER (IDL_LIST (sizer).data).value;
572 fprintf (fh, "%d", length);
576 forb_output_tcstruct_sub_parts (FILE *fh, IDL_tree node)
580 switch (IDL_NODE_TYPE (node)) {
581 case IDLN_TYPE_STRUCT:
582 case IDLN_EXCEPT_DCL: {
585 for (l = IDL_TYPE_STRUCT (node).member_list; l; l = IDL_LIST (l).next) {
588 member = IDL_LIST (l).data;
590 g_assert (IDL_NODE_TYPE (member) == IDLN_MEMBER);
592 length += IDL_list_length (IDL_MEMBER (member).dcls);
596 case IDLN_TYPE_UNION: {
599 for (l = IDL_TYPE_UNION (node).switch_body; l; l = IDL_LIST (l).next) {
602 case_stmt = IDL_LIST (l).data;
604 g_assert (IDL_NODE_TYPE (case_stmt) == IDLN_CASE_STMT);
606 length += IDL_list_length (IDL_CASE_STMT (case_stmt).labels);
611 length = IDL_list_length (IDL_TYPE_ENUM (node).enumerator_list);
614 case IDLN_TYPE_SEQUENCE:
615 case IDLN_TYPE_ARRAY:
623 fprintf (fh, "%d\n", length);
627 forb_output_tcstruct_subnames (FILE *fh, IDL_tree node, int subnames_id)
629 switch (IDL_NODE_TYPE (node)) {
631 if (IDL_TYPE_ENUM (node).enumerator_list)
632 fprintf (fh, "(char **)anon_subnames_array%d", subnames_id);
634 fprintf (fh, "NULL");
636 case IDLN_TYPE_UNION:
637 if (IDL_TYPE_UNION (node).switch_body)
638 fprintf (fh, "(char **)anon_subnames_array%d", subnames_id);
640 fprintf (fh, "NULL");
642 case IDLN_TYPE_STRUCT:
643 case IDLN_EXCEPT_DCL:
644 if (IDL_TYPE_STRUCT (node).member_list)
645 fprintf (fh, "(char **)anon_subnames_array%d", subnames_id);
647 fprintf (fh, "NULL");
650 fprintf (fh, "NULL");
656 forb_output_tcstruct_subtypes (FILE *fh, IDL_tree node, int subtypes_id)
658 switch (IDL_NODE_TYPE (node)) {
659 case IDLN_EXCEPT_DCL:
660 case IDLN_TYPE_STRUCT:
661 if (IDL_TYPE_STRUCT (node).member_list)
662 fprintf (fh, "(CORBA_TypeCode *)anon_subtypes_array%d", subtypes_id);
664 fprintf (fh, "NULL");
666 case IDLN_TYPE_UNION:
667 if (IDL_TYPE_UNION (node).switch_body)
668 fprintf (fh, "(CORBA_TypeCode *)anon_subtypes_array%d", subtypes_id);
670 fprintf (fh, "NULL");
672 case IDLN_TYPE_SEQUENCE:
673 case IDLN_TYPE_ARRAY:
675 fprintf (fh, "(CORBA_TypeCode *)anon_subtypes_array%d", subtypes_id);
678 fprintf (fh, "NULL");
684 forb_output_tcstruct_sublabels (FILE *fh, IDL_tree node, int sublabels_id)
686 switch (IDL_NODE_TYPE (node)) {
687 case IDLN_TYPE_UNION:
688 fprintf (fh, "(CORBA_long *)anon_sublabels_array%d", sublabels_id);
691 fprintf (fh, "NULL");
697 forb_output_tcstruct_discriminator (FILE *fh, IDL_tree node)
699 switch (IDL_NODE_TYPE (node)) {
700 case IDLN_TYPE_UNION: {
701 char *switch_type_spec_str;
703 switch_type_spec_str =
704 forb_cbe_get_typespec_str (IDL_TYPE_UNION (node).switch_type_spec);
706 fprintf (fh, "(CORBA_TypeCode)&TC_%s_struct", switch_type_spec_str);
708 g_free (switch_type_spec_str);
712 fprintf (fh, "CORBA_OBJECT_NIL");
718 forb_output_tcstruct_recurse_depth (FILE *fh)
724 forb_output_tcstruct_default_index (FILE *fh, int union_default_index)
726 fprintf (fh, "%d", union_default_index);
730 forb_output_tcstruct_digits_scale (FILE *fh, IDL_tree node)
732 if (IDL_NODE_TYPE (node) == IDLN_TYPE_FIXED) {
733 fprintf (fh, "%" PRId64 ", %" PRId64 ,
734 IDL_INTEGER (IDL_TYPE_FIXED (node).positive_int_const).value,
735 IDL_INTEGER (IDL_TYPE_FIXED (node).integer_lit).value);
738 fprintf (fh, "0, 0");
742 forb_add_align (GSList **max, const char *str)
746 for (l = *max; l; l = l->next) {
747 if (!strcmp (l->data, str))
750 *max = g_slist_prepend (*max, (gpointer) str);
754 forb_find_c_align (GSList *max, IDL_tree node)
756 node = forb_cbe_get_typespec (node);
758 switch (IDL_NODE_TYPE (node)) {
759 case IDLN_TYPE_INTEGER:
760 switch (IDL_TYPE_INTEGER (node).f_type) {
761 case IDL_INTEGER_TYPE_SHORT:
762 forb_add_align (&max, "FORB_ALIGNOF_CORBA_SHORT");
764 case IDL_INTEGER_TYPE_LONG:
765 forb_add_align (&max, "FORB_ALIGNOF_CORBA_LONG");
767 case IDL_INTEGER_TYPE_LONGLONG:
768 forb_add_align (&max, "FORB_ALIGNOF_CORBA_LONG_LONG");
772 case IDLN_TYPE_FLOAT:
773 switch (IDL_TYPE_FLOAT (node).f_type) {
774 case IDL_FLOAT_TYPE_FLOAT:
775 forb_add_align (&max, "FORB_ALIGNOF_CORBA_FLOAT");
777 case IDL_FLOAT_TYPE_DOUBLE:
778 forb_add_align (&max, "FORB_ALIGNOF_CORBA_DOUBLE");
780 case IDL_FLOAT_TYPE_LONGDOUBLE:
781 forb_add_align (&max, "FORB_ALIGNOF_CORBA_LONG_DOUBLE");
786 forb_add_align (&max, "FORB_ALIGNOF_CORBA_LONG");
788 case IDLN_TYPE_CHAR: /* drop through */
789 case IDLN_TYPE_BOOLEAN:
790 case IDLN_TYPE_OCTET:
791 forb_add_align (&max, "FORB_ALIGNOF_CORBA_CHAR");
793 case IDLN_TYPE_WIDE_CHAR:
794 forb_add_align (&max, "FORB_ALIGNOF_CORBA_SHORT");
796 case IDLN_TYPE_UNION: {
797 IDL_tree l = IDL_TYPE_UNION (node).switch_body;
799 forb_add_align (&max, "FORB_ALIGNOF_CORBA_STRUCT");
801 for (; l; l = IDL_LIST (l).next) {
802 IDL_tree subtype = IDL_MEMBER (IDL_CASE_STMT (
803 IDL_LIST (l).data).element_spec).type_spec;
804 max = forb_find_c_align (max, subtype);
808 case IDLN_EXCEPT_DCL: /* drop through */
809 case IDLN_TYPE_STRUCT: {
810 IDL_tree l = IDL_TYPE_STRUCT (node).member_list;
812 for (; l; l = IDL_LIST (l).next) {
813 IDL_tree member = IDL_MEMBER (IDL_LIST (l).data).type_spec;
815 max = forb_find_c_align (max, member);
819 case IDLN_TYPE_STRING: /* drop through */
820 case IDLN_TYPE_WIDE_STRING:
821 case IDLN_TYPE_OBJECT:
822 case IDLN_TYPE_TYPECODE:
823 case IDLN_FORWARD_DCL:
825 forb_add_align (&max, "FORB_ALIGNOF_CORBA_POINTER");
827 case IDLN_TYPE_ARRAY: {
828 IDL_tree subtype = IDL_TYPE_DCL (
829 IDL_get_parent_node (node, IDLN_TYPE_DCL, NULL)).type_spec;
830 max = forb_find_c_align (max, subtype);
833 case IDLN_TYPE_SEQUENCE:
834 forb_add_align (&max, "FORB_ALIGNOF_CORBA_STRUCT");
835 forb_add_align (&max, "FORB_ALIGNOF_CORBA_LONG");
836 forb_add_align (&max, "FORB_ALIGNOF_CORBA_POINTER");
839 forb_add_align (&max, "FORB_ALIGNOF_CORBA_STRUCT");
840 forb_add_align (&max, "FORB_ALIGNOF_CORBA_POINTER");
843 g_error ("Can't find alignment %s\n",
844 IDL_tree_type_names[IDL_NODE_TYPE (node)]);
852 forb_output_tcstruct_c_align (FILE *fh, IDL_tree node)
855 GString *str = g_string_sized_new (120);
857 max = forb_find_c_align (NULL, node);
860 g_string_append (str, "1");
863 g_string_append (str, max->data);
869 for (l = max; l; l = l->next) {
870 g_string_append (str, "MAX (");
871 g_string_append (str, l->data);
872 g_string_append (str, ", ");
876 g_string_append (str, "1");
878 g_string_append_c (str, ')');
881 fprintf (fh, "%s", str->str);
883 g_string_free (str, TRUE);
887 cbe_tc_generate (OIDL_C_Info *ci,
893 int union_default_index = -1,
894 subnames_id = random_id++,
895 subtypes_id = random_id++,
896 sublabels_id = random_id++;
898 if (strncmp (tci->structname, "anon", 4)) {
899 fprintf (ci->fh, "#if ");
900 forb_cbe_id_cond_hack (ci->fh, "TC_IMPL",
901 tci->structname, ci->c_base_name);
902 fprintf (ci->fh, " && !defined(TC_DEF_%s)\n", tci->structname);
903 fprintf (ci->fh, "#define TC_DEF_%s 1\n", tci->structname);
906 if (IDL_NODE_TYPE (tci->ts) == IDLN_TYPE_DCL) {
909 curitem = IDL_TYPE_DCL (tci->ts).type_spec;
910 subtci.substructname = ctmp = forb_generate_tcstruct_name (curitem);
913 * The only type not already defined elsewhere
914 * that can be in the left half of a TypeCode.
916 if (IDL_NODE_TYPE (curitem) == IDLN_TYPE_SEQUENCE) {
917 subtci.structname = ctmp;
919 cbe_tc_generate (ci, &subtci);
922 for (curitem = IDL_TYPE_DCL (tci->ts).dcls; curitem;
923 curitem = IDL_LIST (curitem).next) {
924 subtci.ts = IDL_LIST (curitem).data;
926 if (IDL_NODE_TYPE (subtci.ts) == IDLN_TYPE_ARRAY)
927 subtci.structname = forb_generate_tcstruct_name (
928 IDL_TYPE_ARRAY (subtci.ts).ident);
930 subtci.structname = forb_generate_tcstruct_name (subtci.ts);
932 cbe_tc_generate (ci, &subtci);
933 g_free (subtci.structname);
940 /* Do magic here - nesting of typecodes for arrays */
941 if (IDL_NODE_TYPE (tci->ts) == IDLN_TYPE_ARRAY &&
942 (IDL_list_length (IDL_TYPE_ARRAY (tci->ts).size_list) > tci->array_gen_ctr)) {
944 curitem = IDL_list_nth (IDL_TYPE_ARRAY (tci->ts).size_list,
945 tci->array_gen_ctr - 1);
948 subtci.structname = ctmp = forb_generate_tcstruct_name (curitem);
949 subtci.array_gen_ctr++;
951 cbe_tc_generate (ci, &subtci);
953 tci->substructname = ctmp; /* FIXME: memory leak */
956 forb_output_tcstruct_anon_subnames_array (ci->fh, tci->ts, subnames_id);
957 forb_output_tcstruct_anon_subtypes_array (ci->fh, tci->ts, subtypes_id,
960 union_default_index = forb_output_tcstruct_anon_sublabels_array (
961 ci->fh, tci->ts, sublabels_id);
963 if (!strncmp (tci->structname, "anon", 4))
964 fprintf (ci->fh, "static ");
966 fprintf (ci->fh, "#ifdef FORB_IDL_C_IMODULE_%s\n",
968 fprintf (ci->fh, "static\n");
969 fprintf (ci->fh, "#endif\n");
972 fprintf (ci->fh, "FORB2_MAYBE_CONST struct CORBA_TypeCode_struct %s_struct = {\n",
975 forb_output_tcstruct_parent (ci->fh);
977 fprintf (ci->fh, ",\n");
979 forb_output_tcstruct_kind (ci->fh, tci->ts, tci->array_gen_ctr);
981 fprintf (ci->fh, ",\n");
984 fprintf (ci->fh, "0,\n");
987 fprintf (ci->fh, "0,\n");
989 forb_output_tcstruct_c_align (ci->fh, tci->ts);
991 fprintf (ci->fh, ",\n");
993 forb_output_tcstruct_length (ci->fh, tci->ts, tci->array_gen_ctr);
995 fprintf (ci->fh, ",\n");
997 forb_output_tcstruct_sub_parts (ci->fh, tci->ts);
999 fprintf (ci->fh, ",\n");
1001 forb_output_tcstruct_subtypes (ci->fh, tci->ts, subtypes_id);
1003 fprintf (ci->fh, ",\n");
1005 forb_output_tcstruct_discriminator (ci->fh, tci->ts);
1007 fprintf (ci->fh, ",\n");
1009 forb_output_tcstruct_name (ci->fh, tci->ts, tci->array_gen_ctr);
1011 fprintf (ci->fh, ",\n");
1013 forb_output_tcstruct_repo_id (ci->fh, tci->ts, tci->array_gen_ctr);
1015 fprintf (ci->fh, ",\n");
1017 forb_output_tcstruct_subnames (ci->fh, tci->ts, subnames_id);
1019 fprintf (ci->fh, ",\n");
1021 forb_output_tcstruct_sublabels (ci->fh, tci->ts, sublabels_id);
1023 fprintf (ci->fh, ",\n");
1025 forb_output_tcstruct_default_index (ci->fh, union_default_index);
1027 fprintf (ci->fh, ",\n");
1029 forb_output_tcstruct_recurse_depth (ci->fh);
1031 fprintf (ci->fh, ",\n");
1033 forb_output_tcstruct_digits_scale (ci->fh, tci->ts);
1035 fprintf (ci->fh, "\n};\n");
1037 if (strncmp (tci->structname, "anon", 4))
1038 fprintf (ci->fh, "#endif\n");