1d0e51869Samw /*
2d0e51869Samw * CDDL HEADER START
3d0e51869Samw *
4d0e51869Samw * The contents of this file are subject to the terms of the
5d0e51869Samw * Common Development and Distribution License (the "License").
6d0e51869Samw * You may not use this file except in compliance with the License.
7d0e51869Samw *
8d0e51869Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9d0e51869Samw * or http://www.opensolaris.org/os/licensing.
10d0e51869Samw * See the License for the specific language governing permissions
11d0e51869Samw * and limitations under the License.
12d0e51869Samw *
13d0e51869Samw * When distributing Covered Code, include this CDDL HEADER in each
14d0e51869Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d0e51869Samw * If applicable, add the following below this CDDL HEADER, with the
16d0e51869Samw * fields enclosed by brackets "[]" replaced with your own identifying
17d0e51869Samw * information: Portions Copyright [yyyy] [name of copyright owner]
18d0e51869Samw *
19d0e51869Samw * CDDL HEADER END
20d0e51869Samw */
21d0e51869Samw
22d0e51869Samw /*
23*a0b6e447SAlan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24d0e51869Samw * Use is subject to license terms.
25d0e51869Samw */
26d0e51869Samw
27d0e51869Samw #include <string.h>
28d0e51869Samw #include "ndrgen.h"
29d0e51869Samw #include "y.tab.h"
30d0e51869Samw
31d0e51869Samw
32d0e51869Samw static void generate_struct(ndr_typeinfo_t *);
33d0e51869Samw static void generate_params(ndr_typeinfo_t *);
34d0e51869Samw static void generate_union(ndr_typeinfo_t *);
35d0e51869Samw static void generate_arg(ndr_node_t *);
36d0e51869Samw static void generate_member_macro(char *, char *, ndr_member_t *,
37d0e51869Samw ndr_typeinfo_t *);
38d0e51869Samw static void generate_member_macro_with_arg(char *, char *, ndr_member_t *,
39d0e51869Samw ndr_typeinfo_t *, ndr_node_t *);
40d0e51869Samw static void generate_prototypes(ndr_typeinfo_t *, char *);
41d0e51869Samw static void generate_member_prototypes(ndr_typeinfo_t *, ndr_member_t *,
42d0e51869Samw char *);
43d0e51869Samw static void generate_member(ndr_typeinfo_t *, ndr_member_t *);
44d0e51869Samw static void generate_aggregate_common_begin(ndr_typeinfo_t *);
45d0e51869Samw static void generate_aggregate_common_finish(ndr_typeinfo_t *);
46d0e51869Samw static void generate_typeinfo_packing(ndr_typeinfo_t *);
47d0e51869Samw static void generate_typeinfo_typeinfo(ndr_typeinfo_t *, int, char *);
48d0e51869Samw
49d0e51869Samw
50d0e51869Samw void
generate(void)51d0e51869Samw generate(void)
52d0e51869Samw {
53d0e51869Samw ndr_typeinfo_t *ti;
54d0e51869Samw char fname_type[NDLBUFSZ];
55d0e51869Samw
56d0e51869Samw (void) printf("\n");
57d0e51869Samw
58d0e51869Samw for (ti = typeinfo_list; ti; ti = ti->next) {
59d0e51869Samw if (ti->is_extern || ti->advice.a_extern) {
60d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
61d0e51869Samw (void) printf(
62d0e51869Samw "extern struct ndr_typeinfo ndt_%s;\n",
63d0e51869Samw fname_type);
64d0e51869Samw continue;
65d0e51869Samw }
66d0e51869Samw
67d0e51869Samw switch (ti->type_op) {
68d0e51869Samw case STRUCT_KW:
69d0e51869Samw if (ti->advice.a_operation)
70d0e51869Samw generate_params(ti);
71d0e51869Samw else
72d0e51869Samw generate_struct(ti);
73d0e51869Samw break;
74d0e51869Samw
75d0e51869Samw case UNION_KW:
76d0e51869Samw generate_union(ti);
77d0e51869Samw break;
78d0e51869Samw
79d0e51869Samw case TYPEDEF_KW:
80d0e51869Samw /* silently skip */
81d0e51869Samw continue;
82d0e51869Samw
83d0e51869Samw case STRING_KW:
84d0e51869Samw case STAR:
85d0e51869Samw case LB:
86d0e51869Samw case BASIC_TYPE:
87d0e51869Samw if (!ti->is_referenced) {
88d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
89d0e51869Samw (void) printf("extern ndt_%s\n", fname_type);
90d0e51869Samw type_null_decl(ti, fname_type, NDLBUFSZ);
91d0e51869Samw (void) printf("/* %s */\n", fname_type);
92d0e51869Samw }
93d0e51869Samw break;
94d0e51869Samw
95d0e51869Samw default:
96d0e51869Samw continue;
97d0e51869Samw }
98d0e51869Samw }
99d0e51869Samw }
100d0e51869Samw
101d0e51869Samw static void
generate_struct(ndr_typeinfo_t * ti)102d0e51869Samw generate_struct(ndr_typeinfo_t *ti)
103d0e51869Samw {
104d0e51869Samw int i;
105d0e51869Samw ndr_member_t *mem;
106d0e51869Samw
107d0e51869Samw if (ti->advice.a_no_reorder) {
108d0e51869Samw /* just use generate_params(), which can safely do this */
109d0e51869Samw generate_params(ti);
110d0e51869Samw return;
111d0e51869Samw }
112d0e51869Samw
113d0e51869Samw generate_aggregate_common_begin(ti);
114d0e51869Samw
115d0e51869Samw (void) printf(" /* do all basic elements first */\n");
116d0e51869Samw for (i = 0; i < ti->n_member; i++) {
117d0e51869Samw mem = &ti->member[i];
118d0e51869Samw if (mem->type->type_op != BASIC_TYPE)
119d0e51869Samw continue;
120d0e51869Samw
121d0e51869Samw generate_member(ti, mem);
122d0e51869Samw }
123d0e51869Samw
124d0e51869Samw (void) printf("\n");
125d0e51869Samw (void) printf(" /* do all constructed elements w/o pointers */\n");
126d0e51869Samw for (i = 0; i < ti->n_member; i++) {
127d0e51869Samw mem = &ti->member[i];
128d0e51869Samw if (mem->type->type_op == BASIC_TYPE)
129d0e51869Samw continue;
130d0e51869Samw
131d0e51869Samw if (mem->type->has_pointers)
132d0e51869Samw continue;
133d0e51869Samw
134d0e51869Samw generate_member(ti, mem);
135d0e51869Samw }
136d0e51869Samw
137d0e51869Samw (void) printf("\n");
138d0e51869Samw (void) printf(" /* do members with pointers in order */\n");
139d0e51869Samw for (i = 0; i < ti->n_member; i++) {
140d0e51869Samw mem = &ti->member[i];
141d0e51869Samw if (mem->type->type_op == BASIC_TYPE)
142d0e51869Samw continue;
143d0e51869Samw
144d0e51869Samw if (!mem->type->has_pointers)
145d0e51869Samw continue;
146d0e51869Samw
147d0e51869Samw generate_member(ti, mem);
148d0e51869Samw }
149d0e51869Samw
150d0e51869Samw generate_aggregate_common_finish(ti);
151d0e51869Samw }
152d0e51869Samw
153d0e51869Samw static void
generate_params(ndr_typeinfo_t * ti)154d0e51869Samw generate_params(ndr_typeinfo_t *ti)
155d0e51869Samw {
156d0e51869Samw int i;
157d0e51869Samw ndr_member_t *mem;
158d0e51869Samw
159d0e51869Samw generate_aggregate_common_begin(ti);
160d0e51869Samw
161d0e51869Samw (void) printf(" /* do all members in order */\n");
162d0e51869Samw for (i = 0; i < ti->n_member; i++) {
163d0e51869Samw mem = &ti->member[i];
164d0e51869Samw
165d0e51869Samw generate_member(ti, mem);
166d0e51869Samw }
167d0e51869Samw
168d0e51869Samw generate_aggregate_common_finish(ti);
169d0e51869Samw }
170d0e51869Samw
171d0e51869Samw static void
generate_union(ndr_typeinfo_t * ti)172d0e51869Samw generate_union(ndr_typeinfo_t *ti)
173d0e51869Samw {
174d0e51869Samw int i;
175d0e51869Samw ndr_member_t *mem;
176d0e51869Samw int have_default = 0;
177d0e51869Samw ndr_node_t *np;
178d0e51869Samw
179d0e51869Samw generate_aggregate_common_begin(ti);
180d0e51869Samw
181d0e51869Samw (void) printf(" switch (encl_ref->switch_is) {\n");
182d0e51869Samw
183d0e51869Samw for (i = 0; i < ti->n_member; i++) {
184d0e51869Samw mem = &ti->member[i];
185d0e51869Samw
186d0e51869Samw if ((np = mem->advice.a_case) != 0) {
187d0e51869Samw (void) printf(" case ");
188d0e51869Samw print_node(np->n_a_arg);
189d0e51869Samw (void) printf(":\n");
190d0e51869Samw } else if ((np = mem->advice.a_default) != 0) {
191d0e51869Samw (void) printf(" default:\n");
192d0e51869Samw if (have_default++) {
193d0e51869Samw compile_error("multiple defaults");
194d0e51869Samw }
195d0e51869Samw } else {
196d0e51869Samw compile_error("syntax error");
197d0e51869Samw }
198d0e51869Samw
199d0e51869Samw generate_member(ti, mem);
200d0e51869Samw (void) printf(" break;\n\n");
201d0e51869Samw }
202d0e51869Samw
203d0e51869Samw if (!have_default) {
204d0e51869Samw (void) printf(" default:\n");
205d0e51869Samw (void) printf(" NDR_SET_ERROR(encl_ref, "
206d0e51869Samw "NDR_ERR_SWITCH_VALUE_INVALID);\n");
207d0e51869Samw (void) printf(" return 0;\n");
208d0e51869Samw (void) printf(" break;\n");
209d0e51869Samw }
210d0e51869Samw
211d0e51869Samw (void) printf(" }\n");
212d0e51869Samw (void) printf("\n");
213d0e51869Samw
214d0e51869Samw generate_aggregate_common_finish(ti);
215d0e51869Samw }
216d0e51869Samw
217d0e51869Samw static void
generate_arg(ndr_node_t * np)218d0e51869Samw generate_arg(ndr_node_t *np)
219d0e51869Samw {
220*a0b6e447SAlan Wright ndr_node_t *arg = np;
221*a0b6e447SAlan Wright
222*a0b6e447SAlan Wright if (np == NULL) {
223*a0b6e447SAlan Wright compile_error("invalid node pointer <null>");
224*a0b6e447SAlan Wright return;
225d0e51869Samw }
226d0e51869Samw
227*a0b6e447SAlan Wright if (np->label != IDENTIFIER && np->label != INTEGER)
228*a0b6e447SAlan Wright arg = np->n_a_arg;
229*a0b6e447SAlan Wright
230*a0b6e447SAlan Wright switch (np->label) {
231*a0b6e447SAlan Wright case SIZE_IS_KW:
232*a0b6e447SAlan Wright case LENGTH_IS_KW:
233*a0b6e447SAlan Wright case SWITCH_IS_KW:
234*a0b6e447SAlan Wright (void) printf("val->");
235*a0b6e447SAlan Wright print_field_attr(np);
236*a0b6e447SAlan Wright break;
237*a0b6e447SAlan Wright default:
238*a0b6e447SAlan Wright if (arg->label == IDENTIFIER)
239*a0b6e447SAlan Wright (void) printf("val->%s", arg->n_sym->name);
240d0e51869Samw else
241*a0b6e447SAlan Wright print_node(arg);
242*a0b6e447SAlan Wright break;
243*a0b6e447SAlan Wright }
244d0e51869Samw }
245d0e51869Samw
246d0e51869Samw static void
generate_member_macro(char * memkind,char * macro,ndr_member_t * mem,ndr_typeinfo_t * ti)247d0e51869Samw generate_member_macro(char *memkind, char *macro, ndr_member_t *mem,
248d0e51869Samw ndr_typeinfo_t *ti)
249d0e51869Samw {
250d0e51869Samw char fname_type[NDLBUFSZ];
251d0e51869Samw
252d0e51869Samw if (!macro)
253d0e51869Samw macro = "";
254d0e51869Samw if (!ti)
255d0e51869Samw ti = mem->type;
256d0e51869Samw
257d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
258d0e51869Samw
259d0e51869Samw if (memkind) {
260d0e51869Samw (void) printf(" NDR_%sMEMBER%s (%s, %s);\n",
261d0e51869Samw memkind, macro, fname_type, mem->name);
262d0e51869Samw } else {
263d0e51869Samw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL);\n",
264d0e51869Samw macro, fname_type, mem->name, mem->pdu_offset);
265d0e51869Samw }
266d0e51869Samw }
267d0e51869Samw
268d0e51869Samw static void
generate_member_macro_with_arg(char * memkind,char * macro,ndr_member_t * mem,ndr_typeinfo_t * ti,ndr_node_t * np)269d0e51869Samw generate_member_macro_with_arg(char *memkind, char *macro,
270d0e51869Samw ndr_member_t *mem, ndr_typeinfo_t *ti, ndr_node_t *np)
271d0e51869Samw {
272d0e51869Samw char fname_type[NDLBUFSZ];
273d0e51869Samw
274d0e51869Samw if (!macro)
275d0e51869Samw macro = "_WITH_ARG";
276d0e51869Samw if (!ti)
277d0e51869Samw ti = mem->type;
278d0e51869Samw
279d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
280d0e51869Samw
281d0e51869Samw if (memkind) {
282d0e51869Samw (void) printf(" NDR_%sMEMBER%s (%s, %s,\n",
283d0e51869Samw memkind, macro, fname_type, mem->name);
284d0e51869Samw } else {
285d0e51869Samw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL,\n",
286d0e51869Samw macro, fname_type, mem->name, mem->pdu_offset);
287d0e51869Samw }
288d0e51869Samw
289d0e51869Samw (void) printf("\t\t");
290d0e51869Samw generate_arg(np);
291d0e51869Samw (void) printf(");\n");
292d0e51869Samw }
293d0e51869Samw
294d0e51869Samw static void
generate_prototypes(ndr_typeinfo_t * ti,char * fname_type)295d0e51869Samw generate_prototypes(ndr_typeinfo_t *ti, char *fname_type)
296d0e51869Samw {
297d0e51869Samw ndr_member_t *mem;
298d0e51869Samw int i;
299d0e51869Samw
300d0e51869Samw if (ti->type_op == STRUCT_KW && ti->advice.a_operation) {
301d0e51869Samw for (i = 0; i < ti->n_member; i++) {
302d0e51869Samw mem = &ti->member[i];
303d0e51869Samw
304d0e51869Samw generate_member_prototypes(ti, mem, fname_type);
305d0e51869Samw }
306d0e51869Samw }
307d0e51869Samw }
308d0e51869Samw
309d0e51869Samw static void
generate_member_prototypes(ndr_typeinfo_t * ti,ndr_member_t * mem,char * fname_type)310d0e51869Samw generate_member_prototypes(ndr_typeinfo_t *ti,
311d0e51869Samw ndr_member_t *mem, char *fname_type)
312d0e51869Samw {
313d0e51869Samw char val_buf[NDLBUFSZ];
314d0e51869Samw ndr_typeinfo_t ptr;
315d0e51869Samw
316d0e51869Samw if (mem->type->type_op == UNION_KW) {
317d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) {
318d0e51869Samw ptr.type_op = STAR;
319d0e51869Samw ptr.type_down = ti;
320d0e51869Samw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val");
321d0e51869Samw
322d0e51869Samw (void) printf("\nextern void fixup%s(%s);\n",
323d0e51869Samw fname_type, val_buf);
324d0e51869Samw }
325d0e51869Samw }
326d0e51869Samw }
327d0e51869Samw
328d0e51869Samw static void
generate_member(ndr_typeinfo_t * ti,ndr_member_t * mem)329d0e51869Samw generate_member(ndr_typeinfo_t *ti, ndr_member_t *mem)
330d0e51869Samw {
331d0e51869Samw static char *fixup[] = {
332d0e51869Samw "/*",
333d0e51869Samw " * Cannot use the canned offsets to unmarshall multiple",
334d0e51869Samw " * entry discriminated unions. The service must provide",
335d0e51869Samw " * this function to patch the offsets at runtime.",
336d0e51869Samw " */"
337d0e51869Samw };
338d0e51869Samw
339d0e51869Samw char fname_type[NDLBUFSZ];
340d0e51869Samw ndr_node_t *np;
341d0e51869Samw int is_reference = 0;
342d0e51869Samw char *memkind = 0;
343d0e51869Samw int cond_pending = 0;
344d0e51869Samw int i;
345d0e51869Samw
346d0e51869Samw if (ti->advice.a_operation)
347d0e51869Samw memkind = "TOPMOST_";
348d0e51869Samw else if (ti->advice.a_interface)
349d0e51869Samw memkind = "PARAMS_";
350d0e51869Samw
351d0e51869Samw if (mem->advice.a_in && !mem->advice.a_out) {
352d0e51869Samw cond_pending = 1;
353d0e51869Samw (void) printf(" if (NDR_DIR_IS_IN) {\n");
354d0e51869Samw }
355d0e51869Samw
356d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) {
357d0e51869Samw cond_pending = 1;
358d0e51869Samw (void) printf(" if (NDR_DIR_IS_OUT) {\n");
359d0e51869Samw }
360d0e51869Samw
361d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
362d0e51869Samw
363d0e51869Samw switch (mem->type->type_op) {
364d0e51869Samw case BASIC_TYPE:
365d0e51869Samw case STRUCT_KW:
366d0e51869Samw generate_member_macro(memkind, 0, mem, 0);
367d0e51869Samw break;
368d0e51869Samw
369d0e51869Samw case UNION_KW:
370d0e51869Samw np = mem->advice.a_switch_is;
371d0e51869Samw
372d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) {
373d0e51869Samw for (i = 0; i < sizeof (fixup)/sizeof (fixup[0]); ++i)
374d0e51869Samw (void) printf("\t%s\n", fixup[i]);
375d0e51869Samw
376d0e51869Samw (void) printf("\tfixup%s(val);\n", fname_type);
377d0e51869Samw }
378d0e51869Samw
379d0e51869Samw generate_member_macro_with_arg(memkind,
380d0e51869Samw "_WITH_SWITCH_IS", mem, 0, np);
381d0e51869Samw break;
382d0e51869Samw
383d0e51869Samw case STAR:
384d0e51869Samw if (mem->advice.a_reference)
385d0e51869Samw is_reference = 1;
386d0e51869Samw else
387d0e51869Samw is_reference = 0;
388d0e51869Samw
389d0e51869Samw np = mem->advice.a_size_is;
390d0e51869Samw if (np) {
391d0e51869Samw generate_member_macro_with_arg(memkind,
392d0e51869Samw is_reference ?
393d0e51869Samw "_REF_WITH_SIZE_IS" : "_PTR_WITH_SIZE_IS",
394d0e51869Samw mem, mem->type->type_down, np);
395d0e51869Samw break;
396d0e51869Samw }
397d0e51869Samw
398d0e51869Samw np = mem->advice.a_length_is;
399d0e51869Samw if (np) {
400d0e51869Samw generate_member_macro_with_arg(memkind,
401d0e51869Samw is_reference ?
402d0e51869Samw "_REF_WITH_LENGTH_IS" : "_PTR_WITH_LENGTH_IS",
403d0e51869Samw mem, mem->type->type_down, np);
404d0e51869Samw break;
405d0e51869Samw }
406d0e51869Samw
407d0e51869Samw generate_member_macro(memkind,
408d0e51869Samw is_reference ? "_REF" : "_PTR",
409d0e51869Samw mem, mem->type->type_down);
410d0e51869Samw break;
411d0e51869Samw
412d0e51869Samw case LB:
413d0e51869Samw np = mem->advice.a_size_is;
414d0e51869Samw if (np) {
415d0e51869Samw generate_member_macro_with_arg(memkind,
416d0e51869Samw "_ARR_WITH_SIZE_IS",
417d0e51869Samw mem, mem->type->type_down, np);
418d0e51869Samw break;
419d0e51869Samw }
420d0e51869Samw
421d0e51869Samw np = mem->advice.a_length_is;
422d0e51869Samw if (np) {
423d0e51869Samw generate_member_macro_with_arg(memkind,
424d0e51869Samw "_WITH_LENGTH_IS",
425d0e51869Samw mem, mem->type->type_down, np);
426d0e51869Samw break;
427d0e51869Samw }
428d0e51869Samw
429d0e51869Samw generate_member_macro_with_arg(memkind,
430d0e51869Samw "_ARR_WITH_DIMENSION",
431d0e51869Samw mem, mem->type->type_down, mem->type->type_dim);
432d0e51869Samw break;
433d0e51869Samw
434d0e51869Samw default:
435d0e51869Samw generate_member_macro(memkind, "_???", mem, 0);
436d0e51869Samw break;
437d0e51869Samw }
438d0e51869Samw
439d0e51869Samw if (cond_pending)
440d0e51869Samw (void) printf(" }\n");
441d0e51869Samw }
442d0e51869Samw
443d0e51869Samw static void
generate_aggregate_common_begin(ndr_typeinfo_t * ti)444d0e51869Samw generate_aggregate_common_begin(ndr_typeinfo_t *ti)
445d0e51869Samw {
446d0e51869Samw char val_buf[NDLBUFSZ];
447d0e51869Samw char cast_buf[NDLBUFSZ];
448d0e51869Samw char fname_type[NDLBUFSZ];
449d0e51869Samw ndr_typeinfo_t ptr;
450d0e51869Samw
451d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ);
452d0e51869Samw generate_typeinfo_typeinfo(ti, 0, fname_type);
453d0e51869Samw generate_prototypes(ti, fname_type);
454d0e51869Samw
455d0e51869Samw (void) printf("\n");
456d0e51869Samw (void) printf("/*\n * ");
457d0e51869Samw show_advice(&ti->advice, 0);
458d0e51869Samw (void) printf(" */\n");
459d0e51869Samw (void) printf("int\n");
460d0e51869Samw (void) printf("ndr_%s (struct ndr_reference *encl_ref)\n",
461d0e51869Samw fname_type);
462d0e51869Samw (void) printf("{\n");
463d0e51869Samw
464d0e51869Samw ptr.type_op = STAR;
465d0e51869Samw ptr.type_down = ti;
466d0e51869Samw
467d0e51869Samw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val");
468d0e51869Samw type_null_decl(&ptr, cast_buf, NDLBUFSZ);
469d0e51869Samw
470d0e51869Samw (void) printf(" %s = %s encl_ref->datum;\n", val_buf, cast_buf);
471d0e51869Samw
472d0e51869Samw (void) printf(" struct ndr_reference myref;\n");
473d0e51869Samw (void) printf("\n");
474d0e51869Samw (void) printf(" (void) bzero(&myref, sizeof (myref));\n");
475d0e51869Samw (void) printf(" myref.enclosing = encl_ref;\n");
476d0e51869Samw (void) printf(" myref.stream = encl_ref->stream;\n");
477d0e51869Samw generate_typeinfo_packing(ti);
478d0e51869Samw (void) printf("\n");
479d0e51869Samw }
480d0e51869Samw
481d0e51869Samw /* ARGSUSED */
482d0e51869Samw static void
generate_aggregate_common_finish(ndr_typeinfo_t * ti)483d0e51869Samw generate_aggregate_common_finish(ndr_typeinfo_t *ti)
484d0e51869Samw {
485d0e51869Samw (void) printf("\n");
486d0e51869Samw (void) printf(" return 1;\n");
487d0e51869Samw (void) printf("}\n");
488d0e51869Samw }
489d0e51869Samw
490d0e51869Samw /*
491d0e51869Samw * Structures are normally 4-byte (dword) aligned but the align directive
492d0e51869Samw * can be used to pack on a 2-byte (word) boundary. An align value of
493d0e51869Samw * zero is taken to mean use default (dword) alignment. Default packing
494d0e51869Samw * doesn't need to be flagged.
495d0e51869Samw */
496d0e51869Samw static void
generate_typeinfo_packing(ndr_typeinfo_t * ti)497d0e51869Samw generate_typeinfo_packing(ndr_typeinfo_t *ti)
498d0e51869Samw {
499d0e51869Samw ndr_node_t *np;
500d0e51869Samw unsigned long packing;
501d0e51869Samw
502d0e51869Samw if ((np = ti->advice.a_align) == NULL)
503d0e51869Samw return;
504d0e51869Samw
505d0e51869Samw if ((np = np->n_a_arg) == NULL)
506d0e51869Samw return;
507d0e51869Samw
508d0e51869Samw packing = np->n_int;
509d0e51869Samw if ((packing == 0) || (packing == 4)) {
510d0e51869Samw /* default alignment */
511d0e51869Samw return;
512d0e51869Samw }
513d0e51869Samw
514d0e51869Samw if (packing != 2) {
515d0e51869Samw fatal_error("invalid align directive: %lu", packing);
516d0e51869Samw /* NOTREACHED */
517d0e51869Samw }
518d0e51869Samw
519d0e51869Samw (void) printf(" myref.packed_alignment = %lu;\n", packing);
520d0e51869Samw }
521d0e51869Samw
522d0e51869Samw static void
generate_typeinfo_typeinfo(ndr_typeinfo_t * ti,int is_static,char * fname_type)523d0e51869Samw generate_typeinfo_typeinfo(ndr_typeinfo_t *ti, int is_static, char *fname_type)
524d0e51869Samw {
525d0e51869Samw char flags[NDLBUFSZ];
526d0e51869Samw
527d0e51869Samw *flags = 0;
528d0e51869Samw if (ti->is_conformant)
529d0e51869Samw (void) strlcat(flags, "|NDR_F_CONFORMANT", NDLBUFSZ);
530d0e51869Samw
531d0e51869Samw if (ti->type_op == STRUCT_KW) {
532d0e51869Samw if (ti->advice.a_operation)
533d0e51869Samw (void) strlcat(flags, "|NDR_F_OPERATION", NDLBUFSZ);
534d0e51869Samw else
535d0e51869Samw (void) strlcat(flags, "|NDR_F_STRUCT", NDLBUFSZ);
536d0e51869Samw }
537d0e51869Samw
538d0e51869Samw if (ti->type_op == UNION_KW) {
539d0e51869Samw if (ti->advice.a_interface)
540d0e51869Samw (void) strlcat(flags, "|NDR_F_INTERFACE", NDLBUFSZ);
541d0e51869Samw else
542d0e51869Samw (void) strlcat(flags, "|NDR_F_UNION", NDLBUFSZ);
543d0e51869Samw }
544d0e51869Samw
545d0e51869Samw if (ti->type_op == STRING_KW)
546d0e51869Samw (void) strlcat(flags, "|NDR_F_STRING", NDLBUFSZ);
547d0e51869Samw if (ti->type_op == LB)
548d0e51869Samw (void) strlcat(flags, "|NDR_F_ARRAY", NDLBUFSZ);
549d0e51869Samw if (ti->type_op == STAR)
550d0e51869Samw (void) strlcat(flags, "|NDR_F_POINTER", NDLBUFSZ);
551d0e51869Samw
552d0e51869Samw if (*flags == 0)
553d0e51869Samw (void) strlcpy(flags, "NDR_F_NONE", NDLBUFSZ);
554d0e51869Samw else
555d0e51869Samw (void) strlcpy(flags, flags+1, NDLBUFSZ);
556d0e51869Samw
557d0e51869Samw (void) printf("\n\n\n");
558d0e51869Samw if (is_static)
559d0e51869Samw (void) printf("static ");
560d0e51869Samw
561d0e51869Samw (void) printf("int ndr_%s (struct ndr_reference *encl_ref);\n",
562d0e51869Samw fname_type);
563d0e51869Samw if (is_static)
564d0e51869Samw (void) printf("static ");
565d0e51869Samw
566d0e51869Samw (void) printf("struct ndr_typeinfo ndt_%s = {\n", fname_type);
567d0e51869Samw (void) printf("\t1, /* NDR version */\n");
568d0e51869Samw (void) printf("\t%d, /* alignment */\n", ti->alignment);
569d0e51869Samw (void) printf("\t%s, /* flags */\n", flags);
570d0e51869Samw (void) printf("\tndr_%s, /* ndr_func */\n", fname_type);
571d0e51869Samw (void) printf("\t%d, /* pdu_size_fixed_part */\n",
572d0e51869Samw ti->size_fixed_part);
573d0e51869Samw (void) printf("\t%d, /* pdu_size_variable_part */\n",
574d0e51869Samw ti->size_variable_part);
575d0e51869Samw
576d0e51869Samw (void) printf("\t%d, /* c_size_fixed_part */\n",
577d0e51869Samw ti->size_fixed_part);
578d0e51869Samw (void) printf("\t%d, /* c_size_variable_part */\n",
579d0e51869Samw ti->size_variable_part);
580d0e51869Samw (void) printf("};\n\n");
581d0e51869Samw }
582