3 #include "forb-idl-c-backend.h"
11 * @param ts Type spec.
13 * @param use_name use identifier from name
14 * @param var_prefix prefix for identifier taken from name
15 * @param serialization
18 forb_cbe_write_ser_var(FILE *of, IDL_tree ts, IDL_tree name,
21 enum forb_ser serialization)
24 GString *id = g_string_new("");
25 char *serialize = (serialization == SERIALIZE) ? "serialize" : "deserialize";
27 switch(IDL_NODE_TYPE(name)) {
31 g_string_assign(id, IDL_IDENT(name).str);
38 g_string_assign(id, IDL_IDENT(IDL_TYPE_ARRAY(name).ident).str);
41 fprintf(of, " {\n CORBA_unsigned_long ");
42 for(curitem = IDL_TYPE_ARRAY(name).size_list; curitem; curitem = IDL_LIST(curitem).next) {
43 fprintf(of, "%c", var);
44 if (IDL_LIST(curitem).next)
46 g_string_append_printf(id, "[%c]", var);
52 for(curitem = IDL_TYPE_ARRAY(name).size_list; curitem; curitem = IDL_LIST(curitem).next) {
54 for (i=0; i<indent+1; i++)
56 fprintf(of, "for (%c=0; %c<%" IDL_LL "d; %c++) \n",
57 var, var, IDL_INTEGER(IDL_LIST(curitem).data).value, var);
62 for (i=0; i<indent+2; i++)
68 g_error("Weird varname - %s", IDL_tree_type_names[IDL_NODE_TYPE(name)]);
72 forb_cbe_write_typespec(of, ts);
73 fprintf(of, "_%s(codec, &%s%s)) goto ser_exception;\n",
74 serialize, var_prefix, id->str);
78 g_string_free(id, TRUE);
83 forb_cbe_get_typecode_name (IDL_tree tree)
86 return g_strdup ("TC_FIXME");
88 return g_strconcat ("TC_", forb_cbe_get_typespec_str (tree), NULL);
92 forb_cbe_type_is_builtin(IDL_tree tree)
95 switch(IDL_NODE_TYPE(tree)) {
105 g_error("Strange type for being a builtin");
109 case IDLN_WIDE_STRING:
116 case IDLN_TYPE_INTEGER:
117 case IDLN_TYPE_FLOAT:
119 case IDLN_TYPE_WIDE_CHAR:
120 case IDLN_TYPE_STRING:
121 case IDLN_TYPE_WIDE_STRING:
122 case IDLN_TYPE_BOOLEAN:
123 case IDLN_TYPE_OCTET:
125 case IDLN_TYPE_OBJECT:
126 case IDLN_TYPE_TYPECODE:
131 case IDLN_EXCEPT_DCL:
135 case IDLN_TYPE_FIXED:
136 case IDLN_TYPE_SEQUENCE:
137 case IDLN_TYPE_ARRAY:
138 case IDLN_TYPE_STRUCT:
139 case IDLN_TYPE_UNION:
142 case IDLN_FORWARD_DCL:
152 Gets the "type" of {tree} as known in C.
153 The return value was alloc'd via g_malloc, and must be g_free'd.
156 forb_cbe_get_typespec_str(IDL_tree tree)
159 GString *tmpstr = NULL;
162 return g_strdup("void");
165 switch(IDL_NODE_TYPE(tree)) {
167 return forb_cbe_get_typespec_str(IDL_MEMBER(tree).type_spec);
170 retval = "CORBA_any";
172 case IDLN_TYPE_FLOAT:
173 switch(IDL_TYPE_FLOAT(tree).f_type) {
174 case IDL_FLOAT_TYPE_FLOAT:
175 retval = "CORBA_float";
177 case IDL_FLOAT_TYPE_DOUBLE:
178 retval = "CORBA_double";
180 case IDL_FLOAT_TYPE_LONGDOUBLE:
181 retval = "CORBA_long_double";
185 case IDLN_TYPE_FIXED:
186 return g_strdup_printf( "CORBA_fixed_%" IDL_LL "d_%" IDL_LL "d",
187 IDL_INTEGER(IDL_TYPE_FIXED(tree).positive_int_const).value,
188 IDL_INTEGER(IDL_TYPE_FIXED(tree).integer_lit).value);
190 case IDLN_TYPE_INTEGER:
191 tmpstr = g_string_new(NULL);
192 g_string_append(tmpstr, "CORBA_");
193 if(!IDL_TYPE_INTEGER(tree).f_signed)
194 g_string_append(tmpstr, "unsigned_");
196 switch(IDL_TYPE_INTEGER(tree).f_type) {
197 case IDL_INTEGER_TYPE_SHORT:
198 g_string_append(tmpstr, "short");
200 case IDL_INTEGER_TYPE_LONGLONG:
201 g_string_append(tmpstr, "long_");
203 case IDL_INTEGER_TYPE_LONG:
204 g_string_append(tmpstr, "long");
208 case IDLN_TYPE_STRING:
209 retval = "CORBA_string"; /* this is non-standard! */
211 case IDLN_TYPE_OCTET:
212 retval = "CORBA_octet";
214 case IDLN_TYPE_WIDE_STRING:
215 retval = "CORBA_wstring"; /* this is non-standard! */
218 retval = "CORBA_char";
220 case IDLN_TYPE_WIDE_CHAR:
221 retval = "CORBA_wchar";
223 case IDLN_TYPE_BOOLEAN:
224 retval = "CORBA_boolean";
226 case IDLN_TYPE_STRUCT:
227 return forb_cbe_get_typespec_str(IDL_TYPE_STRUCT(tree).ident);
228 case IDLN_EXCEPT_DCL:
229 return forb_cbe_get_typespec_str(IDL_EXCEPT_DCL(tree).ident);
230 case IDLN_TYPE_ARRAY:
231 return forb_cbe_get_typespec_str(IDL_TYPE_ARRAY(tree).ident);
232 case IDLN_TYPE_UNION:
233 return forb_cbe_get_typespec_str(IDL_TYPE_UNION(tree).ident);
235 return forb_cbe_get_typespec_str(IDL_TYPE_ENUM(tree).ident);
237 return IDL_ns_ident_to_qstring(IDL_IDENT_TO_NS(tree), "_", 0);
239 return forb_cbe_get_typespec_str(IDL_PARAM_DCL(tree).param_type_spec);
240 case IDLN_TYPE_SEQUENCE:
242 IDL_tree subtype = IDL_TYPE_SEQUENCE(tree).simple_type_spec;
244 ctmp = forb_cbe_get_typespec_str(subtype);
245 /* We should have built-in alias to make this next line not needed */
246 base = forb_cbe_type_is_builtin(subtype)
247 ? ctmp + strlen("CORBA_") : ctmp;
248 retval = g_strdup_printf( "CORBA_sequence_%s", base);
256 case IDLN_FORWARD_DCL:
258 return forb_cbe_get_typespec_str(IDL_INTERFACE(tree).ident);
259 case IDLN_TYPE_OBJECT:
260 retval = "CORBA_Object";
262 case IDLN_TYPE_TYPECODE:
263 retval = "CORBA_TypeCode";
266 g_error("We were asked to get a typename for a %s",
267 IDL_tree_type_names[IDL_NODE_TYPE(tree)]);
272 return g_strdup (retval);
274 return g_string_free (tmpstr, FALSE);
278 forb_cbe_write_typespec(FILE *of, IDL_tree tree)
280 char *name = forb_cbe_get_typespec_str(tree);
286 Parameters (e.g., arguments to methods, and the return value
287 have some complicated rules in the C mapping for how many
288 levels of pointer and the exact type involved. This function
289 generates the externally visible parameter type.
291 Note the hack below because "const CORBA_string" is not
292 promotable to "const CORBA_char*" (the later the standard
293 to which apps are written, while the former is what would
294 be produced without the hack).
297 forb_cbe_write_param_typespec_str(IDL_tree ts, IDL_ParamRole role)
302 GString *str = g_string_sized_new (23);
303 IDL_tree typedef_spec;
306 n = oidl_param_info (ts, role, &isSlice);
307 name = forb_cbe_get_typespec_str (ts);
309 if ( role == DATA_IN ) {
310 /* We want to check if this is a typedef for CORBA_string so we can do special handling
313 typedef_spec = forb_cbe_get_typespec (ts);
314 typedef_name = forb_cbe_get_typespec_str (typedef_spec);
316 g_string_printf (str, "const %s",
317 !strcmp (typedef_name, "CORBA_string") ?
318 "CORBA_char *" : name);
320 g_free (typedef_name);
322 g_string_printf (str, "%s", name);
327 g_string_append (str, "_slice");
329 for (i = 0; i < n; i++)
330 g_string_append_c (str, '*');
332 return g_string_free (str, FALSE);
336 forb_cbe_write_param_typespec_raw (FILE *of, IDL_tree ts, IDL_ParamRole role)
339 str = forb_cbe_write_param_typespec_str (ts, role);
345 forb_cbe_write_param_typespec(FILE *of, IDL_tree tree) {
346 IDL_tree ts = NULL /* Quiet gcc */;
347 IDL_ParamRole role = 0 /* Quiet gcc */;
349 switch ( IDL_NODE_TYPE(tree) ) {
350 case IDLN_OP_DCL: /* means return value of method */
351 ts = IDL_OP_DCL(tree).op_type_spec;
354 case IDLN_PARAM_DCL: /* one of the parameters */
355 ts = IDL_PARAM_DCL(tree).param_type_spec;
356 role = oidl_attr_to_paramrole(IDL_PARAM_DCL(tree).attr);
359 g_assert_not_reached();
361 forb_cbe_write_param_typespec_raw(of, ts, role);
365 forb_cbe_op_write_proto (FILE *of,
367 const char *nom_prefix,
373 g_assert (IDL_NODE_TYPE(op) == IDLN_OP_DCL);
375 forb_cbe_write_param_typespec (of, op);
377 id = IDL_ns_ident_to_qstring (
378 IDL_IDENT_TO_NS (IDL_INTERFACE (
379 IDL_get_parent_node (op, IDLN_INTERFACE, NULL)).ident), "_", 0);
382 fprintf (of, "\t(*%s%s)", nom_prefix ? nom_prefix : "",
383 IDL_IDENT(IDL_OP_DCL(op).ident).str);
385 fprintf (of, " %s%s_%s", nom_prefix ? nom_prefix : "",
386 id, IDL_IDENT (IDL_OP_DCL (op).ident).str);
391 /* fprintf (of, "PortableServer_Servant _servant, "); */
393 fprintf (of, "%s _obj, ", id);
397 for (sub = IDL_OP_DCL (op).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
398 IDL_tree parm = IDL_LIST (sub).data;
400 forb_cbe_write_param_typespec (of, parm);
402 fprintf (of, " %s, ", IDL_IDENT (IDL_PARAM_DCL (parm).simple_declarator).str);
405 if (IDL_OP_DCL (op).context_expr)
406 fprintf (of, "CORBA_Context _ctx, ");
408 fprintf (of, "CORBA_Environment *ev)");
411 /* Writes the value of the constant in 'tree' to file handle 'of' */
413 forb_cbe_get_const(IDL_tree tree)
415 char *opc = NULL, *retval, *ctmp;
416 GString *tmpstr = g_string_new(NULL);
418 switch(IDL_NODE_TYPE(tree)) {
420 g_string_printf(tmpstr, "%s", IDL_BOOLEAN(tree).value?"CORBA_TRUE":"CORBA_FALSE");
423 g_string_printf(tmpstr, "'\\x%X'", *(unsigned char *)IDL_CHAR(tree).value);
426 g_string_printf(tmpstr, "%f", IDL_FLOAT(tree).value);
429 g_string_printf(tmpstr, "%" IDL_LL "d", IDL_INTEGER(tree).value);
432 g_string_printf(tmpstr, "\"%s\"", IDL_STRING(tree).value);
435 g_string_printf(tmpstr, "L'%ls'", IDL_WIDE_CHAR(tree).value);
437 case IDLN_WIDE_STRING:
438 g_string_printf(tmpstr, "L\"%ls\"", IDL_WIDE_STRING(tree).value);
441 g_string_printf(tmpstr, "(");
442 ctmp = forb_cbe_get_const(IDL_BINOP(tree).left);
443 g_string_append(tmpstr, ctmp);
445 switch(IDL_BINOP(tree).op) {
477 g_string_append_printf(tmpstr, " %s ", opc);
478 ctmp = forb_cbe_get_const(IDL_BINOP(tree).right);
479 g_string_append_printf(tmpstr, "%s)", ctmp);
483 switch(IDL_UNARYOP(tree).op) {
484 case IDL_UNARYOP_PLUS: opc = "+"; break;
485 case IDL_UNARYOP_MINUS: opc = "-"; break;
486 case IDL_UNARYOP_COMPLEMENT: opc = "~"; break;
488 ctmp = forb_cbe_get_const(IDL_UNARYOP(tree).operand);
489 g_string_printf(tmpstr, "%s%s", opc, ctmp);
495 id = IDL_ns_ident_to_qstring(IDL_IDENT_TO_NS(tree), "_", 0);
496 g_string_printf(tmpstr, "%s", id);
501 g_error("We were asked to print a constant for %s", IDL_tree_type_names[tree->_type]);
505 retval = tmpstr->str;
507 g_string_free(tmpstr, FALSE);
513 forb_cbe_write_const(FILE *of, IDL_tree tree)
517 ctmp = forb_cbe_get_const(tree);
518 fprintf(of, "%s", ctmp);
522 /* This is the WORST HACK in the WORLD, really truly, but the C preprocessor doesn't allow us to use
523 strings, so we have to work around it by using individual characters. */
525 forb_cbe_id_define_hack(FILE *fh, const char *def_prefix, const char *def_name, const char *def_value)
528 n = strlen(def_value);
529 for(i = 0; i < n; i++)
530 fprintf(fh, "#define %s_%s_%d '%c'\n", def_prefix, def_name, i, def_value[i]);
534 forb_cbe_id_cond_hack(FILE *fh, const char *def_prefix, const char *def_name, const char *def_value)
537 n = strlen(def_value);
543 for(i = 0; i < n; i++)
544 fprintf(fh, "%s (%s_%s_%d == '%c') \\\n", i?"&&":"", def_prefix, def_name, i, def_value[i]);
550 case IDLN_TYPE_FLOAT: \
551 case IDLN_TYPE_ENUM: \
552 case IDLN_TYPE_BOOLEAN: \
553 case IDLN_TYPE_CHAR: \
554 case IDLN_TYPE_WIDE_CHAR: \
557 #define STRING_TYPES \
559 case IDLN_TYPE_WIDE_STRING
561 #define OBJREF_TYPES \
563 case IDLN_INTERFACE: \
564 case IDLN_FORWARD_DCL
567 forb_cbe_flatten_ref (IDL_ParamRole role, IDL_tree typespec)
571 is_fixed = forb_cbe_type_is_fixed_length (typespec);
575 switch (IDL_NODE_TYPE (typespec)) {
579 case IDLN_TYPE_TYPECODE:
581 return "(gpointer)&";
583 case IDLN_TYPE_STRUCT:
584 case IDLN_TYPE_UNION:
586 case IDLN_TYPE_SEQUENCE:
587 case IDLN_TYPE_ARRAY:
591 case IDLN_TYPE_FIXED:
592 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
597 switch (IDL_NODE_TYPE (typespec)) {
601 case IDLN_TYPE_TYPECODE:
602 case IDLN_TYPE_STRUCT:
603 case IDLN_TYPE_UNION:
604 case IDLN_TYPE_ARRAY:
607 case IDLN_TYPE_SEQUENCE:
611 case IDLN_TYPE_FIXED:
612 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
617 switch (IDL_NODE_TYPE (typespec)) {
621 case IDLN_TYPE_TYPECODE:
625 case IDLN_TYPE_STRUCT:
626 case IDLN_TYPE_UNION:
627 case IDLN_TYPE_ARRAY:
630 else /* drop through */
632 case IDLN_TYPE_SEQUENCE:
637 case IDLN_TYPE_FIXED:
638 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
643 g_error ("No data return handler");
651 forb_cbe_flatten_args (IDL_tree tree, FILE *of, const char *name)
656 for (l = IDL_OP_DCL(tree).parameter_dcls; l;
657 l = IDL_LIST(l).next)
660 fprintf (of, "gpointer %s[%d];\n", name, i);
663 for (l = IDL_OP_DCL(tree).parameter_dcls; l;
664 l = IDL_LIST(l).next) {
665 IDL_tree decl = IDL_LIST (l).data;
666 IDL_tree tspec = forb_cbe_get_typespec (decl);
669 switch(IDL_PARAM_DCL(decl).attr) {
670 case IDL_PARAM_IN: r = DATA_IN; break;
671 case IDL_PARAM_INOUT: r = DATA_INOUT; break;
672 case IDL_PARAM_OUT: r = DATA_OUT; break;
674 g_error("Unknown IDL_PARAM type");
677 fprintf (of, "%s[%d] = %s%s;\n",
679 forb_cbe_flatten_ref (r, tspec),
680 IDL_IDENT (IDL_PARAM_DCL (decl).simple_declarator).str);
686 forb_cbe_unflatten_ref (IDL_ParamRole role, IDL_tree typespec)
692 is_fixed = forb_cbe_type_is_fixed_length (typespec);
694 typestr = forb_cbe_write_param_typespec_str (typespec, role);
698 switch (IDL_NODE_TYPE (typespec)) {
702 case IDLN_TYPE_TYPECODE:
704 retval = g_strdup_printf ("*(%s *)", typestr);
708 case IDLN_TYPE_ARRAY:
709 retval = g_strdup_printf ("(%s_slice *)", typestr);
712 case IDLN_TYPE_STRUCT:
713 case IDLN_TYPE_UNION:
715 case IDLN_TYPE_SEQUENCE:
716 retval = g_strdup_printf ("(%s)", typestr);
720 case IDLN_TYPE_FIXED:
721 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
728 switch (IDL_NODE_TYPE (typespec)) {
729 case IDLN_TYPE_ARRAY:
730 retval = g_strdup_printf ("(%s_slice *)", typestr);
736 case IDLN_TYPE_TYPECODE:
737 case IDLN_TYPE_STRUCT:
738 case IDLN_TYPE_UNION:
741 case IDLN_TYPE_SEQUENCE:
742 retval = g_strdup_printf ("(%s)", typestr);
746 case IDLN_TYPE_FIXED:
747 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
754 switch (IDL_NODE_TYPE (typespec)) {
758 case IDLN_TYPE_TYPECODE:
760 retval = g_strdup_printf ("*(%s *)", typestr);
763 case IDLN_TYPE_ARRAY:
765 retval = g_strdup_printf ("*(%s_slice **)", typestr);
770 case IDLN_TYPE_STRUCT:
771 case IDLN_TYPE_UNION:
773 retval = g_strdup_printf ("*(%s *)", typestr);
778 case IDLN_TYPE_SEQUENCE:
780 retval = g_strdup_printf ("(%s)", typestr);
784 case IDLN_TYPE_FIXED:
785 g_error ("Hit evil type %d", IDL_NODE_TYPE (typespec));
793 g_error ("No data return handler");
804 forb_cbe_unflatten_args (IDL_tree tree, FILE *of, const char *name)
809 for (l = IDL_OP_DCL(tree).parameter_dcls; l;
810 l = IDL_LIST(l).next) {
811 IDL_tree decl = IDL_LIST (l).data;
812 IDL_tree tspec = forb_cbe_get_typespec (decl);
816 switch(IDL_PARAM_DCL(decl).attr) {
817 case IDL_PARAM_IN: r = DATA_IN; break;
818 case IDL_PARAM_INOUT: r = DATA_INOUT; break;
819 case IDL_PARAM_OUT: r = DATA_OUT; break;
821 g_error("Unknown IDL_PARAM type");
824 unflatten = forb_cbe_unflatten_ref (r, tspec);
825 fprintf (of, "%s%s[%d], ", unflatten, name, i++);