]> rtime.felk.cvut.cz Git - orte.git/blob - orte/idl-compiler/orte-idl-c-impls.c
70c8e3ef0bdf97f9a86969460ef7a2e4d86c284b
[orte.git] / orte / idl-compiler / orte-idl-c-impls.c
1 //#include "config.h"
2 #include "orte-idl-c-backend.h"
3
4 #include <string.h>
5 #include <ctype.h>
6
7 /* ch = C header */
8 static void ci_output_impls (IDL_tree tree,OIDL_Run_Info *rinfo,OIDL_C_Info *ci);
9
10
11 void
12 orte_idl_output_c_impls (IDL_tree tree, OIDL_Run_Info *rinfo, OIDL_C_Info *ci)
13 {
14   fprintf (ci->fh, OIDL_C_WARNING);
15
16   fprintf(ci->fh, "#include \"%s.h\"\n\n",ci->base_name);
17
18   /* Do all the serialization, deserialization etc. */
19   ci_output_impls(tree, rinfo, ci);
20
21 }
22
23 static void
24 ci_output_var(IDL_tree val, IDL_tree name, OIDL_C_Info *ci, int type)
25 {
26
27   fprintf(ci->fh, "  ");
28   orte_cbe_write_typespec(ci->fh, val);
29
30   switch (type) {
31   case 0:
32     fprintf(ci->fh, "_serialize(cdrCodec,&(object->");
33     break;      
34   case 1:
35     fprintf(ci->fh, "_deserialize(cdrCodec,&(object->");
36     break;      
37   default:
38     break;
39   }
40
41   switch(IDL_NODE_TYPE(name)) {
42   case IDLN_IDENT:
43     fprintf(ci->fh, "%s", IDL_IDENT(name).str);
44     break;
45 /*  case IDLN_TYPE_ARRAY:
46     {
47       IDL_tree curitem;
48
49       fprintf(ci->fh, "%s", IDL_IDENT(IDL_TYPE_ARRAY(name).ident).str);
50       for(curitem = IDL_TYPE_ARRAY(name).size_list; curitem; curitem = IDL_LIST(curitem).next) {
51         fprintf(ci->fh, "[%" IDL_LL "d]", IDL_INTEGER(IDL_LIST(curitem).data).value);
52       }
53     }
54     break;*/
55   default:
56     g_error("Weird varname - %s", IDL_tree_type_names[IDL_NODE_TYPE(name)]);
57     break;
58   }
59
60 //  if (type==1)
61     fprintf(ci->fh, ")");
62
63   fprintf(ci->fh, ");\n");
64 }
65
66 static void
67 ci_output_impls_struct(IDL_tree tree, OIDL_Run_Info *rinfo, OIDL_C_Info *ci)
68 {
69   char *id;
70   IDL_tree cur,curmem,cur_tspec;
71
72   id = IDL_ns_ident_to_qstring(IDL_IDENT_TO_NS(IDL_TYPE_STRUCT(tree).ident), 
73     "_", 0);
74
75   /* serialize */
76   fprintf(ci->fh, "/****************************************************************/\n");
77   fprintf(ci->fh, "/* struct - %-50s  */\n", id);
78   fprintf(ci->fh, "/****************************************************************/\n\n");
79   
80   fprintf(ci->fh, "void %s_serialize(CDR_Codec *cdrCodec,%s *object) {\n", id, id);
81 //  fprintf(ci->fh, "  %s *object=(%s*)instance;\n\n", id, id);
82
83   for(cur = IDL_TYPE_STRUCT(tree).member_list; cur; cur = IDL_LIST(cur).next) {
84     for(curmem = IDL_MEMBER(IDL_LIST(cur).data).dcls; curmem; curmem = IDL_LIST(curmem).next) {
85       ci_output_var(IDL_MEMBER(IDL_LIST(cur).data).type_spec, IDL_LIST(curmem).data, ci, 0);
86     }
87   }
88   fprintf(ci->fh, "}\n\n");
89
90   /* deserialize */
91   fprintf(ci->fh, "void\n%s_deserialize(CDR_Codec *cdrCodec,%s *object) {\n", id, id);
92 //  fprintf(ci->fh, "  %s *object=(%s*)instance;\n\n", id, id);
93
94   for(cur = IDL_TYPE_STRUCT(tree).member_list; cur; cur = IDL_LIST(cur).next) {
95     for(curmem = IDL_MEMBER(IDL_LIST(cur).data).dcls; curmem; curmem = IDL_LIST(curmem).next) {
96       ci_output_var(IDL_MEMBER(IDL_LIST(cur).data).type_spec, IDL_LIST(curmem).data, ci, 1);
97     }
98   }
99   fprintf(ci->fh, "}\n\n");
100
101   /* get_max_size */
102   fprintf(ci->fh, "int\n%s_get_max_size(ORTEGetMaxSizeParam *gms) {\n", id);
103
104   for(cur = IDL_TYPE_STRUCT(tree).member_list; cur; cur = IDL_LIST(cur).next) {
105     for(curmem = IDL_MEMBER(IDL_LIST(cur).data).dcls; curmem; curmem = IDL_LIST(curmem).next) {
106        fprintf(ci->fh, "  ");
107        orte_cbe_write_typespec(ci->fh, IDL_MEMBER(IDL_LIST(cur).data).type_spec);
108        fprintf(ci->fh, "_get_max_size(gms");
109
110        cur_tspec=IDL_MEMBER(IDL_LIST(cur).data).type_spec;
111        switch (IDL_NODE_TYPE (cur_tspec)) {
112        case IDLN_TYPE_STRING:
113             if (IDL_TYPE_STRING (cur_tspec).positive_int_const) {
114                 int length = IDL_INTEGER (IDL_TYPE_STRING (cur_tspec).positive_int_const).value;
115                 fprintf(ci->fh, ",%d",length);                 
116             }
117             break;
118        default:
119             break;
120        }
121        fprintf(ci->fh, ");\n");
122     }
123   }
124   fprintf(ci->fh, "  return gms->csize;\n");
125   fprintf(ci->fh, "}\n\n");
126
127   /* get_max_size */
128   fprintf(ci->fh, "Boolean\n%s_type_register(ORTEDomain *d) {\n", id);
129   fprintf(ci->fh, "  Boolean ret;\n\n");
130   fprintf(ci->fh, "  ret=ORTETypeRegisterAdd(d,\n");
131   fprintf(ci->fh, "                          \"%s\",\n",id);
132   fprintf(ci->fh, "                          (ORTETypeSerialize)%s_serialize,\n",id);
133   fprintf(ci->fh, "                          (ORTETypeDeserialize)%s_deserialize,\n",id);
134   fprintf(ci->fh, "                          %s_get_max_size,\n",id);
135   fprintf(ci->fh, "                          0);\n");
136   fprintf(ci->fh, "  return ret;\n");
137   fprintf(ci->fh, "}\n\n");
138
139   /* Scan for any nested decls */
140 /*  for(cur = IDL_TYPE_STRUCT(tree).member_list; cur; cur = IDL_LIST(cur).next) {
141     IDL_tree ts;
142     ts = IDL_MEMBER(IDL_LIST(cur).data).type_spec;
143     switch (IDL_NODE_TYPE (ts)) {
144         case IDLN_TYPE_STRUCT:
145                 ch_output_decl(ts, rinfo, ci);
146                 break;
147         default:
148                 break;
149         }
150   }
151
152   g_free(id);*/
153 }
154
155
156 static void
157 ci_output_impls (IDL_tree       tree,
158                  OIDL_Run_Info *rinfo,
159                  OIDL_C_Info   *ci)
160 {
161         if (!tree)
162                 return;
163
164         switch (IDL_NODE_TYPE (tree)) {
165         case IDLN_TYPE_STRUCT:
166                 ci_output_impls_struct (tree, rinfo, ci);
167                 break;
168         default:
169                 break;
170         }
171
172         switch (IDL_NODE_TYPE (tree)) {
173         case IDLN_MODULE:
174                 ci_output_impls (IDL_MODULE (tree).definition_list, rinfo, ci);
175                 break;
176         case IDLN_LIST: {
177                 IDL_tree sub;
178
179                 for (sub = tree; sub; sub = IDL_LIST (sub).next) {
180                         ci_output_impls (IDL_LIST (sub).data, rinfo, ci);
181                 }
182                 }
183                 break;
184         case IDLN_INTERFACE:
185                 ci_output_impls (IDL_INTERFACE (tree).body, rinfo, ci);
186                 break;
187         default:
188                 break;
189         }
190 }