1 /* @(#)rpc_parse.c 1.1 87/11/04 3.9 RPCSRC */
3 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4 * unrestricted use provided that this legend is included on all tape
5 * media and as a part of the software program in whole or part. Users
6 * may copy or modify Sun RPC without charge, but are not authorized
7 * to license or distribute it to anyone else except as part of a product or
8 * program developed by the user.
10 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14 * Sun RPC is provided with no support and without any obligation on the
15 * part of Sun Microsystems, Inc. to assist in its use, correction,
16 * modification or enhancement.
18 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20 * OR ANY PART THEREOF.
22 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23 * or profits or other special, indirect and consequential damages, even if
24 * Sun has been advised of the possibility of such damages.
26 * Sun Microsystems, Inc.
28 * Mountain View, California 94043
32 * rpc_parse.c, Parser for the RPC protocol compiler
33 * Copyright (C) 1987 Sun Microsystems, Inc.
35 #include <afsconfig.h>
36 #include <afs/param.h>
43 #include "rpc_parse.h"
46 list
*proc_defined
[MAX_PACKAGES
], *special_defined
, *typedef_defined
,
47 *uniondef_defined
, *complex_defined
;
48 char *SplitStart
= NULL
;
49 char *SplitEnd
= NULL
;
50 char *MasterPrefix
= NULL
;
51 char *ServerPrefix
= "";
52 char *PackagePrefix
[MAX_PACKAGES
];
53 char *PackageStatIndex
[MAX_PACKAGES
];
54 int no_of_stat_funcs
= 0; /*
55 * current function number in client interface
58 int no_of_stat_funcs_header
[MAX_PACKAGES
]; /*
59 * Total number of functions in client
62 int no_of_opcodes
[MAX_PACKAGES
], master_no_of_opcodes
= 0;
63 int lowest_opcode
[MAX_PACKAGES
], master_lowest_opcode
= 99999;
64 int highest_opcode
[MAX_PACKAGES
], master_highest_opcode
= 0;
65 int master_opcodenumber
= 99999;
66 int opcodesnotallowed
[MAX_PACKAGES
];
67 int combinepackages
= 0;
68 int PackageIndex
= -1;
69 int PerProcCounter
= 0;
74 * Character arrays to keep list of function names as we process the file
77 char function_list
[MAX_PACKAGES
]
78 [MAX_FUNCTIONS_PER_PACKAGE
]
79 [MAX_FUNCTION_NAME_LEN
];
80 int function_list_index
;
82 /* static prototypes */
83 static void isdefined(definition
* defp
);
84 static void def_struct(definition
* defp
);
85 static void def_enum(definition
* defp
);
86 static void def_const(definition
* defp
);
87 static void def_union(definition
* defp
);
88 static void def_typedef(definition
* defp
);
89 static void get_declaration(declaration
* dec
, defkind dkind
);
90 static void get_type(char **prefixp
, char **typep
, defkind dkind
);
91 static void unsigned_dec(char **typep
);
92 static void def_package(definition
* defp
);
93 static void def_prefix(definition
* defp
);
94 static void def_statindex(definition
* defp
);
95 static void def_startingopcode(definition
* defp
);
96 static void def_split(definition
* defp
);
97 static void customize_struct(definition
* defp
);
98 static char *structname(char *name
);
99 static void def_special(declaration
* dec
, definition
* defp
);
100 static void check_proc(definition
* defp
, token
* tokp
, int noname
);
101 static int InvalidConstant(char *name
);
102 static int opcodenum_is_defined(int opcode_num
);
103 static void analyze_ProcParams(definition
* defp
, token
* tokp
);
104 static void generate_code(definition
* defp
, int proc_split_flag
,
106 static void handle_split_proc(definition
* defp
, int multi_flag
);
107 static void do_split(definition
* defp
, int direction
, int *numofparams
,
108 defkind param_kind
, int restore_flag
);
109 static void hdle_param_tok(definition
* defp
, declaration
* dec
, token
* tokp
,
111 static void get1_param_type(definition
* defp
, declaration
* dec
,
113 static void get_param_type(definition
* defp
, declaration
* dec
,
114 char **param_type
, char **typename
);
116 static void hndle_param_tail(definition
* defp
, declaration
* dec
,
117 token
* tokp
, char *typename
);
119 static void cs_Proc_CodeGeneration(definition
* defp
, int split_flag
,
121 static void cs_ProcName_setup(definition
* defp
, char *procheader
,
123 static void cs_ProcParams_setup(definition
* defp
, int split_flag
);
124 static void cs_ProcMarshallInParams_setup(definition
* defp
, int split_flag
);
125 static void cs_ProcSendPacket_setup(definition
* defp
, int split_flag
);
126 static void cs_ProcUnmarshallOutParams_setup(definition
* defp
);
127 static void cs_ProcTail_setup(definition
* defp
, int split_flag
);
128 static void ucs_ProcName_setup(definition
* defp
, char *procheader
,
130 static void ucs_ProcParams_setup(definition
* defp
, int split_flag
);
131 static void ucs_ProcTail_setup(definition
* defp
, int split_flag
);
132 static void ss_Proc_CodeGeneration(definition
* defp
);
133 static void ss_ProcName_setup(definition
* defp
);
134 static void ss_ProcParams_setup(definition
* defp
);
135 static void ss_ProcSpecial_setup(definition
* defp
);
136 static void ss_ProcUnmarshallInParams_setup(definition
* defp
);
137 static void ss_ProcCallRealProc_setup(definition
* defp
);
138 static void ss_ProcMarshallOutParams_setup(definition
* defp
);
139 static void ss_ProcTail_setup(definition
* defp
);
140 static int opcode_holes_exist(void);
141 static void er_ProcDeclExterns_setup(void);
142 static void er_ProcProcsArray_setup(void);
143 static void er_ProcMainBody_setup(void);
144 static void er_HeadofOldStyleProc_setup(void);
145 static void er_HeadofOldStyleProc_setup2(void);
146 static void er_BodyofOldStyleProc_setup(void);
147 static void er_BodyofOldStyleProc_setup2(void);
148 static void proc_er_case(definition
* defp
);
149 static void er_TailofOldStyleProc_setup(void);
150 static void er_TailofOldStyleProc_setup2(void);
155 * return the next definition you see
163 defp
= ALLOC(definition
);
164 memset(defp
, 0, sizeof(definition
));
197 def_special(&dec
, defp
);
200 case TOK_STARTINGOPCODE
:
201 def_startingopcode(defp
);
206 customize_struct(defp
);
208 case TOK_SPLITPREFIX
:
213 if (tok
.kind
== TOK_LPAREN
) {
215 check_proc(defp
, &tok
, 1);
217 check_proc(defp
, &tok
, 0);
220 check_proc(defp
, &tok
, 0);
224 check_proc(defp
, &tok
, 1);
227 error("definition keyword expected");
229 if (!IsRxgenToken(&tok
)) {
230 scan(TOK_SEMICOLON
, &tok
);
238 isdefined(definition
* defp
)
240 STOREVAL(&defined
, defp
);
245 def_struct(definition
* defp
)
253 defp
->def_kind
= DEF_STRUCT
;
255 scan(TOK_IDENT
, &tok
);
256 defp
->def_name
= tok
.str
;
257 scan(TOK_LBRACE
, &tok
);
258 tailp
= &defp
->def
.st
.decls
;
260 get_declaration(&dec
, DEF_STRUCT
);
261 /* If a structure contains an array, then we're going
262 * to need to be clever about freeing it */
263 if (dec
.rel
== REL_ARRAY
) {
266 decls
= ALLOC(decl_list
);
269 tailp
= &decls
->next
;
270 scan(TOK_SEMICOLON
, &tok
);
272 } while (tok
.kind
!= TOK_RBRACE
);
277 STOREVAL(&complex_defined
, defp
);
281 def_enum(definition
* defp
)
285 enumval_list
**tailp
;
287 defp
->def_kind
= DEF_ENUM
;
288 scan(TOK_IDENT
, &tok
);
289 defp
->def_name
= tok
.str
;
290 scan(TOK_LBRACE
, &tok
);
291 tailp
= &defp
->def
.en
.vals
;
293 scan(TOK_IDENT
, &tok
);
294 elist
= ALLOC(enumval_list
);
295 elist
->name
= tok
.str
;
296 elist
->assignment
= NULL
;
297 scan3(TOK_COMMA
, TOK_RBRACE
, TOK_EQUAL
, &tok
);
298 if (tok
.kind
== TOK_EQUAL
) {
300 elist
->assignment
= tok
.str
;
301 scan2(TOK_COMMA
, TOK_RBRACE
, &tok
);
304 tailp
= &elist
->next
;
305 } while (tok
.kind
!= TOK_RBRACE
);
310 def_const(definition
* defp
)
314 defp
->def_kind
= DEF_CONST
;
315 scan(TOK_IDENT
, &tok
);
316 defp
->def_name
= tok
.str
;
317 scan(TOK_EQUAL
, &tok
);
318 scan2(TOK_IDENT
, TOK_STRCONST
, &tok
);
319 defp
->def
.co
= tok
.str
;
323 def_union(definition
* defp
)
330 defp
->def_kind
= DEF_UNION
;
331 scan(TOK_IDENT
, &tok
);
332 defp
->def_name
= tok
.str
;
333 scan(TOK_SWITCH
, &tok
);
334 scan(TOK_LPAREN
, &tok
);
335 get_declaration(&dec
, DEF_UNION
);
336 defp
->def
.un
.enum_decl
= dec
;
337 tailp
= &defp
->def
.un
.cases
;
338 scan(TOK_RPAREN
, &tok
);
339 scan(TOK_LBRACE
, &tok
);
340 scan(TOK_CASE
, &tok
);
341 while (tok
.kind
== TOK_CASE
) {
342 scan(TOK_IDENT
, &tok
);
343 cases
= ALLOC(case_list
);
344 cases
->case_name
= tok
.str
;
345 scan(TOK_COLON
, &tok
);
346 get_declaration(&dec
, DEF_UNION
);
347 cases
->case_decl
= dec
;
349 tailp
= &cases
->next
;
350 scan(TOK_SEMICOLON
, &tok
);
351 scan3(TOK_CASE
, TOK_DEFAULT
, TOK_RBRACE
, &tok
);
354 if (tok
.kind
== TOK_DEFAULT
) {
355 scan(TOK_COLON
, &tok
);
356 get_declaration(&dec
, DEF_UNION
);
357 defp
->def
.un
.default_decl
= ALLOC(declaration
);
358 *defp
->def
.un
.default_decl
= dec
;
359 scan(TOK_SEMICOLON
, &tok
);
360 scan(TOK_RBRACE
, &tok
);
362 defp
->def
.un
.default_decl
= NULL
;
368 def_typedef(definition
* defp
)
372 memset(&dec
, 0, sizeof(dec
));
374 defp
->def_kind
= DEF_TYPEDEF
;
375 get_declaration(&dec
, DEF_TYPEDEF
);
376 defp
->def_name
= dec
.name
;
377 defp
->def
.ty
.old_prefix
= dec
.prefix
;
378 defp
->def
.ty
.old_type
= dec
.type
;
379 defp
->def
.ty
.rel
= dec
.rel
;
380 defp
->def
.ty
.array_max
= dec
.array_max
;
385 get_declaration(declaration
* dec
, defkind dkind
)
389 get_type(&dec
->prefix
, &dec
->type
, dkind
);
390 dec
->rel
= REL_ALIAS
;
391 if (streq(dec
->type
, "void")) {
394 scan2(TOK_STAR
, TOK_IDENT
, &tok
);
395 if (tok
.kind
== TOK_STAR
) {
396 dec
->rel
= REL_POINTER
;
397 scan(TOK_IDENT
, &tok
);
400 if (peekscan(TOK_LBRACKET
, &tok
)) {
401 if (dec
->rel
== REL_POINTER
) {
402 error("no array-of-pointer declarations -- use typedef");
404 dec
->rel
= REL_VECTOR
;
406 dec
->array_max
= tok
.str
;
407 scan(TOK_RBRACKET
, &tok
);
408 } else if (peekscan(TOK_LANGLE
, &tok
)) {
409 if (dec
->rel
== REL_POINTER
) {
410 error("no array-of-pointer declarations -- use typedef");
412 dec
->rel
= REL_ARRAY
;
413 if (peekscan(TOK_RANGLE
, &tok
)) {
414 if ((dkind
== DEF_INPARAM
) || (dkind
== DEF_INOUTPARAM
)) {
415 error("input arrays must specify a max size");
417 dec
->array_max
= "~0u"; /* unspecified size, use max */
420 dec
->array_max
= tok
.str
;
421 scan(TOK_RANGLE
, &tok
);
424 if (streq(dec
->type
, "opaque")) {
425 if (dec
->rel
!= REL_ARRAY
&& dec
->rel
!= REL_VECTOR
) {
426 error("array declaration expected");
428 } else if (streq(dec
->type
, "string")) {
429 if (dec
->rel
!= REL_ARRAY
) {
430 error(" variable-length array declaration expected");
437 get_type(char **prefixp
, char **typep
, defkind dkind
)
451 scan(TOK_IDENT
, &tok
);
459 (void)peekscan(TOK_INT
, &tok
);
462 *typep
= "afs_int32";
463 (void)peekscan(TOK_INT
, &tok
);
466 if (dkind
!= DEF_UNION
) {
467 error("voids allowed only inside union definitions");
482 error("expected type specifier");
488 unsigned_dec(char **typep
)
501 (void)peekscan(TOK_INT
, &tok
);
505 *typep
= "afs_uint32";
506 (void)peekscan(TOK_INT
, &tok
);
520 def_package(definition
* defp
)
524 defp
->def_kind
= DEF_PACKAGE
;
525 scan(TOK_IDENT
, &tok
);
526 defp
->def_name
= tok
.str
;
527 no_of_stat_funcs
= 0;
530 if (PackageIndex
>= MAX_PACKAGES
)
531 error("Exceeded upper limit of package statements\n");
533 function_list_index
= 0;
534 PackagePrefix
[PackageIndex
] = tok
.str
;
535 if (MasterPrefix
== NULL
)
536 MasterPrefix
= tok
.str
;
537 no_of_opcodes
[PackageIndex
] = highest_opcode
[PackageIndex
] =
538 opcodesnotallowed
[PackageIndex
] = 0;
539 lowest_opcode
[PackageIndex
] = 99999;
540 proc_defined
[PackageIndex
] = NULL
;
541 PackageStatIndex
[PackageIndex
] = NULL
;
545 def_prefix(definition
* defp
)
549 defp
->def_kind
= DEF_PREFIX
;
550 scan(TOK_IDENT
, &tok
);
551 defp
->def_name
= tok
.str
;
552 ServerPrefix
= tok
.str
;
556 def_statindex(definition
* defp
)
561 defp
->def_kind
= DEF_CONST
;
563 if (PackageIndex
< 0)
564 error("'statindex' command must follow 'package' command!\n");
565 if (PackageStatIndex
[PackageIndex
])
566 error("Cannot have more then one 'statindex' per package!\n");
567 if (InvalidConstant(tok
.str
))
568 error("Index in 'statindex' command must be a constant!");
570 alloc(strlen(PackagePrefix
[PackageIndex
]) + strlen("STATINDEX") + 1);
571 strcpy(name
, PackagePrefix
[PackageIndex
]);
572 strcat(name
, "STATINDEX");
573 defp
->def_name
= name
;
574 defp
->def
.co
= tok
.str
;
575 PackageStatIndex
[PackageIndex
] = name
;
576 StatIndex
= atoi(tok
.str
);
580 def_startingopcode(definition
* defp
)
584 defp
->def_kind
= DEF_STARTINGOPCODE
;
585 scan(TOK_IDENT
, &tok
);
586 defp
->def_name
= tok
.str
;
587 if (InvalidConstant(defp
->def_name
))
588 error("Opcode in 'startingopcode' command must be a constant!");
589 lowest_opcode
[PackageIndex
] = master_lowest_opcode
= atoi(tok
.str
);
590 if (lowest_opcode
[PackageIndex
] < 0
591 || lowest_opcode
[PackageIndex
] > 99999)
593 ("startingopcode number is out of bounds (must be >= 0 < 100000)");
594 master_opcodenumber
= lowest_opcode
[PackageIndex
];
595 opcodesnotallowed
[PackageIndex
] = 1;
599 def_split(definition
* defp
)
603 defp
->def_kind
= DEF_SPLITPREFIX
;
608 scan(TOK_EQUAL
, &tok
);
609 scan(TOK_IDENT
, &tok
);
610 SplitStart
= tok
.str
;
613 scan(TOK_EQUAL
, &tok
);
614 scan(TOK_IDENT
, &tok
);
620 error("syntax error in the 'splitprefix' line");
622 } while (tok
.kind
!= TOK_SEMICOLON
);
623 if (!SplitStart
&& !SplitEnd
)
624 error("At least one param should be passed to 'splitprefix' cmd");
629 customize_struct(definition
* defp
)
633 definition
*defp1
= ALLOC(definition
);
634 spec_list
*specs
, **tailp
;
636 defp
->def_kind
= DEF_CUSTOMIZED
;
637 defp1
->def_kind
= DEF_SPECIAL
;
638 tailp
= &defp1
->def
.sd
.specs
;
639 for (listp
= defp
->def
.st
.decls
; listp
; listp
= listp
->next
) {
641 if (streq(dec
->type
, "string") || (dec
->rel
== REL_POINTER
)) {
642 specs
= ALLOC(spec_list
);
643 specs
->sdef
.string_name
= dec
->name
;
644 specs
->sdef
.string_value
= defp
->def_name
;
646 tailp
= &specs
->next
;
650 STOREVAL(&special_defined
, defp1
);
654 structname(char *name
)
656 static char namecontents
[150];
659 strcpy(namecontents
, name
);
661 if (!strncmp(pnt
, "struct", 6))
663 while (isspace(*pnt
))
666 while (*pnt
!= ' ' && *pnt
!= '\0')
674 def_special(declaration
* dec
, definition
* defp
)
677 spec_list
*specs
, **tailp
;
680 defp
->def_kind
= DEF_SPECIAL
;
681 get_type(&dec
->prefix
, &dec
->type
, DEF_SPECIAL
);
682 dec
->rel
= REL_POINTER
;
683 scan(TOK_IDENT
, &tok
);
684 tailp
= &defp
->def
.sd
.specs
;
686 specs
= ALLOC(spec_list
);
687 specs
->sdef
.string_name
= tok
.str
;
688 get_param_type(defp
, dec
, &specs
->sdef
.string_value
, &typename
);
690 tailp
= &specs
->next
;
691 scan2(TOK_COMMA
, TOK_SEMICOLON
, &tok
);
692 if (tok
.kind
== TOK_SEMICOLON
)
695 } while (tok
.kind
== TOK_IDENT
);
697 STOREVAL(&special_defined
, defp
);
701 proc1_list
*Proc_list
, **Proc_listp
;
704 check_proc(definition
* defp
, token
* tokp
, int noname
)
710 if (PackageIndex
< 0)
711 error("Procedure must be in a package!\n");
713 tokp
->kind
= TOK_PROC
;
714 defp
->def_kind
= DEF_PROC
;
716 defp
->pc
.proc_name
= "";
718 defp
->pc
.proc_name
= tokp
->str
;
720 defp
->pc
.proc_prefix
= alloc(strlen(PackagePrefix
[PackageIndex
]) + 1);
721 strcpy(defp
->pc
.proc_prefix
, PackagePrefix
[PackageIndex
]);
722 scan2(TOK_LPAREN
, TOK_IDENT
, &tok
);
723 defp
->pc
.proc_serverstub
= NULL
;
724 if (tok
.kind
== TOK_IDENT
) {
725 defp
->pc
.proc_serverstub
= tok
.str
;
726 scan(TOK_LPAREN
, &tok
);
728 analyze_ProcParams(defp
, &tok
);
729 defp
->pc
.proc_opcodenum
= -1;
730 scan4(TOK_SPLIT
, TOK_MULTI
, TOK_EQUAL
, TOK_SEMICOLON
, &tok
);
731 if (tok
.kind
== TOK_MULTI
) {
733 defp
->pc
.multi_flag
= 1;
734 scan2(TOK_EQUAL
, TOK_SEMICOLON
, &tok
);
736 defp
->pc
.multi_flag
= 0;
738 if (tok
.kind
== TOK_SPLIT
) {
740 defp
->pc
.split_flag
= 1;
741 scan2(TOK_EQUAL
, TOK_SEMICOLON
, &tok
);
743 defp
->pc
.split_flag
= 0;
745 if (tok
.kind
== TOK_EQUAL
) {
746 if (opcodesnotallowed
[PackageIndex
])
747 error("Opcode assignment isn't allowed here!");
749 if (InvalidConstant(tok
.str
))
750 error("Illegal Opcode assignment (Must be a constant opcode!)");
751 if (opcodenum_is_defined(atoi(tok
.str
)))
752 error("The opcode number is already used by a previous proc");
753 defp
->pc
.proc_opcodename
= tok
.str
;
754 defp
->pc
.proc_opcodenum
= atoi(tok
.str
);
755 if (defp
->pc
.proc_opcodenum
< lowest_opcode
[PackageIndex
])
756 lowest_opcode
[PackageIndex
] = defp
->pc
.proc_opcodenum
;
757 if (defp
->pc
.proc_opcodenum
< master_lowest_opcode
)
758 master_lowest_opcode
= defp
->pc
.proc_opcodenum
;
759 if (defp
->pc
.proc_opcodenum
> highest_opcode
[PackageIndex
])
760 highest_opcode
[PackageIndex
] = defp
->pc
.proc_opcodenum
;
761 if (defp
->pc
.proc_opcodenum
> master_highest_opcode
)
762 master_highest_opcode
= defp
->pc
.proc_opcodenum
;
763 scan(TOK_SEMICOLON
, &tok
);
765 if (master_opcodenumber
== 99999)
766 master_opcodenumber
= 0;
767 defp
->pc
.proc_opcodenum
= master_opcodenumber
++;
768 if (defp
->pc
.proc_opcodenum
< lowest_opcode
[PackageIndex
])
769 lowest_opcode
[PackageIndex
] = defp
->pc
.proc_opcodenum
;
770 if (defp
->pc
.proc_opcodenum
> highest_opcode
[PackageIndex
])
771 highest_opcode
[PackageIndex
] = defp
->pc
.proc_opcodenum
;
772 if (defp
->pc
.proc_opcodenum
> master_highest_opcode
)
773 master_highest_opcode
= defp
->pc
.proc_opcodenum
;
774 opcodesnotallowed
[PackageIndex
] = 1; /* force it */
776 no_of_opcodes
[PackageIndex
]++, master_no_of_opcodes
++;
778 generate_code(defp
, 0, 1);
779 if (Cflag
|| cflag
) {
780 generate_code(defp
, 1, 1);
782 generate_multi_macros(defp
);
784 generate_code(defp
, proc_split
, 0);
787 if (function_list_index
>= MAX_FUNCTIONS_PER_INTERFACE
) {
788 error("too many functions in interface, "
789 "increase MAX_FUNCTIONS_PER_INTERFACE");
791 sprintf(function_list
[PackageIndex
][function_list_index
], "%s%s%s",
792 prefix
, PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
794 function_list_index
++;
795 defp
->statindex
= no_of_stat_funcs
;
796 no_of_stat_funcs_header
[PackageIndex
]++;
802 #define LEGALNUMS "0123456789"
804 InvalidConstant(char *name
)
810 slen
= (int)strlen(name
);
811 return (slen
!= strspn(name
, map
));
815 opcodenum_is_defined(int opcode_num
)
820 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
821 listp
= listp
->next
) {
822 defp
= (definition
*) listp
->val
;
823 if (opcode_num
== defp
->pc
.proc_opcodenum
)
831 analyze_ProcParams(definition
* defp
, token
* tokp
)
834 decl_list
*decls
, **tailp
;
836 Proc_listp
= &defp
->pc
.plists
;
837 tailp
= &defp
->def
.st
.decls
;
840 Proc_list
= ALLOC(proc1_list
);
841 memset(Proc_list
, 0, sizeof(proc1_list
));
842 Proc_list
->pl
.param_flag
= 0;
843 switch (tokp
->kind
) {
845 hdle_param_tok(defp
, &dec
, tokp
, DEF_INPARAM
);
848 hdle_param_tok(defp
, &dec
, tokp
, DEF_OUTPARAM
);
851 hdle_param_tok(defp
, &dec
, tokp
, DEF_INOUTPARAM
);
857 hdle_param_tok(defp
, &dec
, tokp
, DEF_NULL
);
860 *Proc_listp
= Proc_list
;
861 Proc_listp
= &Proc_list
->next
;
862 decls
= ALLOC(decl_list
);
863 memset(decls
, 0, sizeof(decl_list
));
864 if (tokp
->kind
!= TOK_RPAREN
)
867 tailp
= &decls
->next
;
868 } while (tokp
->kind
!= TOK_RPAREN
);
874 generate_code(definition
* defp
, int proc_split_flag
, int multi_flag
)
877 handle_split_proc(defp
, multi_flag
);
879 if (Cflag
|| cflag
) {
880 cs_Proc_CodeGeneration(defp
, 0, "");
883 ss_Proc_CodeGeneration(defp
);
885 if (Sflag
|| (cflag
&& xflag
&& !proc_split_flag
) || hflag
)
886 STOREVAL(&proc_defined
[PackageIndex
], defp
);
891 handle_split_proc(definition
* defp
, int multi_flag
)
893 char *startname
= SplitStart
, *endname
= SplitEnd
;
900 if (Cflag
|| cflag
) {
902 do_split(defp
, OUT
, &numofparams
, DEF_OUTPARAM
, 0);
904 cs_Proc_CodeGeneration(defp
, 1, startname
);
906 do_split(defp
, OUT
, &numofparams
, DEF_OUTPARAM
, 1);
907 do_split(defp
, IN
, &numofparams
, DEF_INPARAM
, 0);
909 cs_Proc_CodeGeneration(defp
, (multi_flag
? 3 : 2), endname
);
911 do_split(defp
, IN
, &numofparams
, DEF_INPARAM
, 1);
915 ss_Proc_CodeGeneration(defp
);
920 do_split(definition
* defp
, int direction
, int *numofparams
,
921 defkind param_kind
, int restore_flag
)
926 defp
->pc
.paramtypes
[direction
] = *numofparams
;
927 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
928 if (plist
->component_kind
== DEF_NULL
929 && plist
->pl
.param_kind
== param_kind
)
930 plist
->component_kind
= DEF_PARAM
;
933 *numofparams
= defp
->pc
.paramtypes
[direction
];
934 defp
->pc
.paramtypes
[direction
] = 0;
935 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
936 if (plist
->component_kind
== DEF_PARAM
937 && plist
->pl
.param_kind
== param_kind
)
938 plist
->component_kind
= DEF_NULL
;
945 hdle_param_tok(definition
* defp
, declaration
* dec
, token
* tokp
,
948 static defkind last_param_kind
= DEF_NULL
;
950 if (par_kind
== DEF_NULL
)
951 Proc_list
->pl
.param_kind
= last_param_kind
;
953 Proc_list
->pl
.param_kind
= par_kind
;
954 last_param_kind
= Proc_list
->pl
.param_kind
;
955 defp
->pc
.paramtypes
[(int)last_param_kind
]++;
956 Proc_list
->component_kind
= DEF_PARAM
;
957 Proc_list
->code
= alloc(250);
958 Proc_list
->scode
= alloc(250);
959 get_declaration(dec
, par_kind
);
960 Proc_list
->pl
.param_name
= dec
->name
;
961 get1_param_type(defp
, dec
, &Proc_list
->pl
.param_type
);
963 scan2(TOK_COMMA
, TOK_RPAREN
, tokp
);
964 if (tokp
->kind
== TOK_COMMA
)
970 get1_param_type(definition
* defp
, declaration
* dec
, char **param_type
)
972 char typecontents
[100];
974 if (streq(dec
->type
, "string")) {
975 *param_type
= "char *";
978 strcpy(typecontents
, dec
->prefix
);
979 strcat(typecontents
, " ");
980 strcat(typecontents
, dec
->type
);
981 strcat(typecontents
, " *");
982 } else if (dec
->rel
== REL_POINTER
) {
983 strcpy(typecontents
, dec
->type
);
984 strcat(typecontents
, " *");
986 strcpy(typecontents
, dec
->type
);
987 *param_type
= alloc(100);
988 strcpy(*param_type
, typecontents
);
994 get_param_type(definition
* defp
, declaration
* dec
, char **param_type
,
997 char typecontents
[100];
999 if (streq(dec
->type
, "string")) {
1000 *typename
= "wrapstring";
1001 *param_type
= "char *";
1003 *typename
= dec
->type
;
1005 strcpy(typecontents
, dec
->prefix
);
1006 strcat(typecontents
, " ");
1007 strcat(typecontents
, dec
->type
);
1008 strcat(typecontents
, " *");
1009 dec
->rel
= REL_POINTER
;
1010 } else if (dec
->rel
== REL_POINTER
) {
1011 strcpy(typecontents
, dec
->type
);
1012 strcat(typecontents
, " *");
1014 strcpy(typecontents
, dec
->type
);
1015 *param_type
= alloc(100);
1016 strcpy(*param_type
, typecontents
);
1023 hndle_param_tail(definition
* defp
, declaration
* dec
, token
* tokp
,
1028 if (dec
->rel
== REL_POINTER
)
1029 Proc_list
->pl
.param_flag
|= INDIRECT_PARAM
;
1031 Proc_list
->pl
.param_flag
&= ~INDIRECT_PARAM
;
1033 if (!(Proc_list
->pl
.param_flag
& INDIRECT_PARAM
))
1036 sprintf(Proc_list
->code
, "xdr_%s(&z_xdrs, %s%s)", typename
, amp
,
1037 Proc_list
->pl
.param_name
);
1038 sprintf(Proc_list
->scode
, "xdr_%s(z_xdrs, &%s)", typename
,
1039 Proc_list
->pl
.param_name
);
1040 scan2(TOK_COMMA
, TOK_RPAREN
, tokp
);
1041 if (tokp
->kind
== TOK_COMMA
)
1048 cs_Proc_CodeGeneration(definition
* defp
, int split_flag
, char *procheader
)
1051 cs_ProcName_setup(defp
, procheader
, split_flag
);
1053 cs_ProcParams_setup(defp
, split_flag
);
1054 cs_ProcMarshallInParams_setup(defp
, split_flag
);
1055 if (split_flag
!= 1) {
1056 cs_ProcSendPacket_setup(defp
, split_flag
);
1057 cs_ProcUnmarshallOutParams_setup(defp
);
1059 cs_ProcTail_setup(defp
, split_flag
);
1062 if (!kflag
&& !split_flag
&& uflag
) {
1063 ucs_ProcName_setup(defp
, "ubik_", split_flag
);
1065 ucs_ProcParams_setup(defp
, split_flag
);
1066 ucs_ProcTail_setup(defp
, split_flag
);
1072 cs_ProcName_setup(definition
* defp
, char *procheader
, int split_flag
)
1079 first_arg
= "struct rx_call *z_call";
1081 first_arg
= "struct rx_connection *z_conn";
1085 first_arg
= "z_call";
1087 first_arg
= "z_conn";
1092 f_print(fout
, "int %s%s%s%s(%s", procheader
, prefix
,
1093 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
, first_arg
);
1095 if ((strlen(procheader
) + strlen(prefix
) +
1096 strlen(PackagePrefix
[PackageIndex
]) + strlen(defp
->pc
.proc_name
)) >=
1097 MAX_FUNCTION_NAME_LEN
) {
1098 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1101 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1102 if (plist
->component_kind
== DEF_PARAM
) {
1105 if (plist
->pl
.param_kind
== DEF_INPARAM
&&
1106 strcmp(plist
->pl
.param_type
, "char *") == 0) {
1107 f_print(fout
, "const ");
1109 if (plist
->pl
.param_flag
& OUT_STRING
) {
1110 f_print(fout
, "%s *%s", plist
->pl
.param_type
,
1111 plist
->pl
.param_name
);
1113 f_print(fout
, "%s %s", plist
->pl
.param_type
,
1114 plist
->pl
.param_name
);
1117 f_print(fout
, " %s", plist
->pl
.param_name
);
1118 plist
->pl
.param_flag
&= ~PROCESSED_PARAM
;
1122 f_print(fout
, ")\n");
1127 cs_ProcParams_setup(definition
* defp
, int split_flag
)
1129 proc1_list
*plist
, *plist1
;
1135 f_print(fout
, "\tstruct rx_connection *z_conn;\n");
1137 f_print(fout
, "\tstruct rx_call *z_call;\n");
1139 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1140 if (plist
->component_kind
== DEF_PARAM
1141 && !(plist
->pl
.param_flag
& PROCESSED_PARAM
)) {
1142 if (plist
->pl
.param_flag
& OUT_STRING
) {
1143 f_print(fout
, "\t%s *%s", plist
->pl
.param_type
,
1144 plist
->pl
.param_name
);
1146 f_print(fout
, "\t%s %s", plist
->pl
.param_type
,
1147 plist
->pl
.param_name
);
1149 plist
->pl
.param_flag
|= PROCESSED_PARAM
;
1150 for (plist1
= defp
->pc
.plists
; plist1
; plist1
= plist1
->next
) {
1151 if ((plist1
->component_kind
== DEF_PARAM
)
1152 && streq(plist
->pl
.param_type
, plist1
->pl
.param_type
)
1153 && !(plist1
->pl
.param_flag
& PROCESSED_PARAM
)) {
1155 char *pntr
= strchr(plist1
->pl
.param_type
, '*');
1158 if (plist1
->pl
.param_flag
& OUT_STRING
) {
1159 f_print(fout
, ", *%s%s", star
, plist1
->pl
.param_name
);
1161 f_print(fout
, ", %s%s", star
, plist1
->pl
.param_name
);
1163 plist1
->pl
.param_flag
|= PROCESSED_PARAM
;
1166 f_print(fout
, ";\n");
1173 cs_ProcMarshallInParams_setup(definition
* defp
, int split_flag
)
1175 int noofparams
, i
= 0;
1179 defp
->pc
.paramtypes
[IN
] + defp
->pc
.paramtypes
[INOUT
] +
1180 defp
->pc
.paramtypes
[OUT
];
1182 f_print(fout
, "{\n");
1184 f_print(fout
, "\tstruct rx_call *z_call = rx_NewCall(z_conn);\n");
1185 if ((!split_flag
) || (split_flag
== 1)) {
1186 if (opcodesnotallowed
[PackageIndex
]) {
1187 f_print(fout
, "\tstatic int z_op = %d;\n",
1188 defp
->pc
.proc_opcodenum
);
1190 f_print(fout
, "\tstatic int z_op = %s;\n",
1191 defp
->pc
.proc_opcodename
);
1194 f_print(fout
, "\tint z_result;\n");
1195 if (!(split_flag
> 1) || (noofallparams
!= 0)) {
1196 f_print(fout
, "\tXDR z_xdrs;\n");
1199 if ((!split_flag
) || (split_flag
== 1)) {
1200 f_print(fout
, "\txdrrx_create(&z_xdrs, z_call, XDR_ENCODE);\n");
1201 f_print(fout
, "\n\t/* Marshal the arguments */\n");
1202 f_print(fout
, "\tif ((!xdr_int(&z_xdrs, &z_op))");
1203 noofparams
= defp
->pc
.paramtypes
[IN
] + defp
->pc
.paramtypes
[INOUT
];
1204 for (plist
= defp
->pc
.plists
, dl
= defp
->def
.st
.decls
; plist
;
1205 plist
= plist
->next
, dl
= dl
->next
) {
1206 if (plist
->component_kind
== DEF_PARAM
1207 && (plist
->pl
.param_kind
== DEF_INPARAM
1208 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)) {
1209 f_print(fout
, "\n\t || (!%s)", plist
->code
);
1210 if (++i
== noofparams
) {
1212 ") {\n\t\tz_result = RXGEN_CC_MARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1219 ") {\n\t\tz_result = RXGEN_CC_MARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1227 cs_ProcSendPacket_setup(definition
* defp
, int split_flag
)
1229 int noofoutparams
= defp
->pc
.paramtypes
[INOUT
] + defp
->pc
.paramtypes
[OUT
];
1231 if (noofoutparams
) {
1232 f_print(fout
, "\t/* Un-marshal the reply arguments */\n");
1234 f_print(fout
, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
1236 f_print(fout
, "\tz_xdrs.x_op = XDR_DECODE;\n");
1243 cs_ProcUnmarshallOutParams_setup(definition
* defp
)
1249 noofparams
= defp
->pc
.paramtypes
[INOUT
] + defp
->pc
.paramtypes
[OUT
];
1251 for (plist
= defp
->pc
.plists
, dl
= defp
->def
.st
.decls
, i
= 0; plist
;
1252 plist
= plist
->next
, dl
= dl
->next
) {
1253 if (plist
->component_kind
== DEF_PARAM
1254 && (plist
->pl
.param_kind
== DEF_OUTPARAM
1255 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)) {
1257 f_print(fout
, "\tif ((!%s)", plist
->code
);
1259 f_print(fout
, "\n\t || (!%s)", plist
->code
);
1261 if (++i
== noofparams
) {
1263 ") {\n\t\tz_result = RXGEN_CC_UNMARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1272 cs_ProcTail_setup(definition
* defp
, int split_flag
)
1274 f_print(fout
, "\tz_result = RXGEN_SUCCESS;\n");
1275 if (defp
->can_fail
) {
1276 f_print(fout
, "fail:\n");
1279 f_print(fout
, "\tz_result = rx_EndCall(z_call, z_result);\n");
1281 if (xflag
&& split_flag
!= 1) {
1282 f_print(fout
, "\tif (rx_enable_stats) {\n");
1283 if (PackageStatIndex
[PackageIndex
]) {
1285 "\t rx_RecordCallStatistics(z_call, %s,\n",
1286 PackageStatIndex
[PackageIndex
]);
1289 "\t rx_RecordCallStatistics(z_call, \n"
1290 "\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
1291 "\t\t((afs_uint32)ntohs(rx_PortOf(rx_PeerOf(rx_ConnectionOf(z_call)))))),\n");
1293 f_print(fout
, "\t\t%d, %sNO_OF_STAT_FUNCS, 1);\n",
1294 no_of_stat_funcs
, PackagePrefix
[PackageIndex
]);
1295 f_print(fout
, "\t}\n\n");
1297 f_print(fout
, "\treturn z_result;\n}\n\n");
1302 ss_Proc_CodeGeneration(definition
* defp
)
1310 ss_ProcName_setup(defp
);
1312 ss_ProcParams_setup(defp
);
1313 ss_ProcSpecial_setup(defp
);
1314 ss_ProcUnmarshallInParams_setup(defp
);
1315 ss_ProcCallRealProc_setup(defp
);
1316 ss_ProcMarshallOutParams_setup(defp
);
1317 ss_ProcTail_setup(defp
);
1323 ss_ProcName_setup(definition
* defp
)
1327 if ((strlen(prefix
) + strlen(PackagePrefix
[PackageIndex
]) +
1328 strlen(defp
->pc
.proc_name
)) >= MAX_FUNCTION_NAME_LEN
) {
1329 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1333 f_print(fout
, "static afs_int32 _%s%s%s(", prefix
,
1334 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1335 f_print(fout
, "struct rx_call *z_call, XDR *z_xdrs)\n{\n");
1336 f_print(fout
, "\t" "afs_int32 z_result;\n");
1338 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
)
1339 if (plist
->component_kind
== DEF_PARAM
) {
1340 plist
->pl
.param_flag
&= ~(PROCESSED_PARAM
);
1341 plist
->pl
.string_name
= NULL
;
1348 ss_ProcParams_setup(definition
* defp
)
1350 proc1_list
*plist
, *plist1
;
1354 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1355 if ((plist
->component_kind
== DEF_PARAM
)
1356 && !(plist
->pl
.param_flag
& PROCESSED_PARAM
)) {
1357 if (plist
->pl
.param_flag
& INDIRECT_PARAM
) {
1358 char pres
= '\0', *pntr
= strchr(plist
->pl
.param_type
, '*');
1364 f_print(fout
, "\t%s %s", plist
->pl
.param_type
,
1365 plist
->pl
.param_name
);
1368 } else if (strchr(plist
->pl
.param_type
, '*') == 0) {
1369 f_print(fout
, "\t%s %s", plist
->pl
.param_type
,
1370 plist
->pl
.param_name
);
1372 plist
->pl
.param_flag
|= FREETHIS_PARAM
;
1373 f_print(fout
, "\t%s %s=(%s)0", plist
->pl
.param_type
,
1374 plist
->pl
.param_name
, plist
->pl
.param_type
);
1376 plist
->pl
.param_flag
|= PROCESSED_PARAM
;
1377 for (plist1
= defp
->pc
.plists
; plist1
; plist1
= plist1
->next
) {
1378 if ((plist1
->component_kind
== DEF_PARAM
)
1379 && streq(plist
->pl
.param_type
, plist1
->pl
.param_type
)
1380 && !(plist1
->pl
.param_flag
& PROCESSED_PARAM
)) {
1381 if (plist1
->pl
.param_flag
& INDIRECT_PARAM
) {
1382 f_print(fout
, ", %s", plist1
->pl
.param_name
);
1383 } else if (strchr(plist1
->pl
.param_type
, '*') == 0) {
1384 f_print(fout
, ", %s", plist1
->pl
.param_name
);
1386 plist1
->pl
.param_flag
|= FREETHIS_PARAM
;
1387 f_print(fout
, ", *%s=(%s)0", plist1
->pl
.param_name
,
1388 plist1
->pl
.param_type
);
1390 plist1
->pl
.param_flag
|= PROCESSED_PARAM
;
1393 f_print(fout
, ";\n");
1396 for (listp
= typedef_defined
; listp
!= NULL
; listp
= listp
->next
) {
1397 defp1
= (definition
*) listp
->val
;
1398 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1399 if (plist
->component_kind
== DEF_PARAM
1400 && (plist
->pl
.param_kind
== DEF_OUTPARAM
1401 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)
1402 && !(plist
->pl
.param_flag
& FREETHIS_PARAM
)) {
1403 if (streq(defp1
->def_name
, structname(plist
->pl
.param_type
))) {
1404 switch (defp1
->pc
.rel
) {
1414 fprintf(fout
, "\n");
1419 ss_ProcSpecial_setup(definition
* defp
)
1425 for (listp
= special_defined
; listp
!= NULL
; listp
= listp
->next
) {
1426 defp1
= (definition
*) listp
->val
;
1428 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1429 if (plist
->component_kind
== DEF_PARAM
1430 && (plist
->pl
.param_kind
== DEF_INPARAM
1431 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)) {
1432 spec_list
*spec
= defp1
->def
.sd
.specs
;
1434 strcpy(string
, structname(spec
->sdef
.string_value
));
1435 if (streq(string
, structname(plist
->pl
.param_type
))) {
1436 plist
->pl
.string_name
= spec
->sdef
.string_name
;
1437 plist
->pl
.param_flag
|= FREETHIS_PARAM
;
1442 for (listp
= typedef_defined
; listp
!= NULL
; listp
= listp
->next
) {
1443 defp1
= (definition
*) listp
->val
;
1444 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1445 if (plist
->component_kind
== DEF_PARAM
) {
1446 if (streq(defp1
->def_name
, structname(plist
->pl
.param_type
))) {
1447 plist
->pl
.param_flag
|= FREETHIS_PARAM
;
1448 switch (defp1
->pc
.rel
) {
1450 plist
->pl
.string_name
= alloc(40);
1452 s_print(plist
->pl
.string_name
, "val");
1454 s_print(plist
->pl
.string_name
, "%s_val",
1459 plist
->pl
.string_name
= NULL
;
1468 for (listp
= complex_defined
; listp
!= NULL
; listp
= listp
->next
) {
1469 defp1
= (definition
*) listp
->val
;
1470 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1471 if (plist
->component_kind
== DEF_PARAM
) {
1472 if (streq(defp1
->def_name
, structname(plist
->pl
.param_type
))) {
1473 plist
->pl
.param_flag
|= FREETHIS_PARAM
;
1479 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1480 if (plist
->component_kind
== DEF_PARAM
) {
1481 fprintf(fout
, "\n\tmemset(&%s, 0, sizeof(%s));",
1482 plist
->pl
.param_name
,
1483 plist
->pl
.param_name
);
1487 f_print(fout
, "\n");
1492 ss_ProcUnmarshallInParams_setup(definition
* defp
)
1494 int noofparams
, noofoutparams
, i
;
1497 noofparams
= defp
->pc
.paramtypes
[IN
] + defp
->pc
.paramtypes
[INOUT
];
1498 noofoutparams
= defp
->pc
.paramtypes
[INOUT
] + defp
->pc
.paramtypes
[OUT
];
1499 for (plist
= defp
->pc
.plists
, i
= 0; plist
; plist
= plist
->next
) {
1500 if (plist
->component_kind
== DEF_PARAM
1501 && (plist
->pl
.param_kind
== DEF_INPARAM
1502 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)) {
1504 f_print(fout
, "\n\tif ((!%s)",
1505 (plist
->scode
? plist
->scode
: plist
->code
));
1507 f_print(fout
, "\n\t || (!%s)",
1508 (plist
->scode
? plist
->scode
: plist
->code
));
1510 if (++i
== noofparams
) {
1511 if (!noofoutparams
) {
1512 f_print(fout
, ") {\n");
1514 f_print(fout
, ") {\n");
1517 "\t\tz_result = RXGEN_SS_UNMARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1526 ss_ProcCallRealProc_setup(definition
* defp
)
1531 f_print(fout
, "\tz_result = %s%s%s%s(z_call", prefix
, ServerPrefix
,
1532 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1533 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1534 if (plist
->component_kind
== DEF_PARAM
) {
1535 if (plist
->pl
.param_flag
& INDIRECT_PARAM
) {
1536 f_print(fout
, ", &%s", plist
->pl
.param_name
);
1538 if (plist
->pl
.param_flag
& OUT_STRING
) {
1539 f_print(fout
, ", &%s", plist
->pl
.param_name
);
1541 f_print(fout
, ", %s", plist
->pl
.param_name
);
1546 f_print(fout
, ");\n");
1548 f_print(fout
, "\tif (z_result)\n\t\treturn z_result;\n");
1550 f_print(fout
, "\tif (z_result)\n\t\tgoto fail;\n");
1556 ss_ProcMarshallOutParams_setup(definition
* defp
)
1561 noofparams
= defp
->pc
.paramtypes
[INOUT
] + defp
->pc
.paramtypes
[OUT
];
1563 f_print(fout
, "\tz_xdrs->x_op = XDR_ENCODE;\n");
1565 for (plist
= defp
->pc
.plists
, i
= 0; plist
; plist
= plist
->next
) {
1566 if (plist
->component_kind
== DEF_PARAM
1567 && (plist
->pl
.param_kind
== DEF_OUTPARAM
1568 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)) {
1570 f_print(fout
, "\tif ((!%s)",
1571 (plist
->scode
? plist
->scode
: plist
->code
));
1573 f_print(fout
, "\n\t || (!%s)",
1574 (plist
->scode
? plist
->scode
: plist
->code
));
1576 if (++i
== noofparams
) {
1577 f_print(fout
, ")\n\t\tz_result = RXGEN_SS_MARSHAL;\n");
1585 ss_ProcTail_frees(char *xdrfunc
, int *somefrees
) {
1587 f_print(fout
, "\tz_xdrs->x_op = XDR_FREE;\n");
1588 f_print(fout
, "\tif ((!%s)", xdrfunc
);
1591 f_print(fout
, "\n\t || (!%s)", xdrfunc
);
1597 ss_ProcTail_setup(definition
* defp
)
1604 if (defp
->can_fail
) {
1605 f_print(fout
, "fail:\n");
1608 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1609 if (plist
->component_kind
== DEF_PARAM
1610 && (plist
->pl
.param_flag
& FREETHIS_PARAM
))
1611 ss_ProcTail_frees(plist
->scode
, &somefrees
);
1614 for (listp
= typedef_defined
; listp
!= NULL
; listp
= listp
->next
) {
1615 defp1
= (definition
*) listp
->val
;
1616 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1617 if (plist
->component_kind
== DEF_PARAM
1618 && (plist
->pl
.param_kind
== DEF_OUTPARAM
1619 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)
1620 && !(plist
->pl
.param_flag
& FREETHIS_PARAM
)) {
1621 if (streq(defp1
->def_name
, structname(plist
->pl
.param_type
))) {
1622 switch (defp1
->pc
.rel
) {
1625 ss_ProcTail_frees(plist
->scode
, &somefrees
);
1635 for (listp
= uniondef_defined
; listp
!= NULL
; listp
= listp
->next
) {
1636 defp1
= (definition
*) listp
->val
;
1637 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1638 if (plist
->component_kind
== DEF_PARAM
1639 && (plist
->pl
.param_kind
== DEF_OUTPARAM
1640 || plist
->pl
.param_kind
== DEF_INOUTPARAM
)
1641 && !(plist
->pl
.param_flag
& FREETHIS_PARAM
)) {
1642 if (streq(defp1
->def_name
, structname(plist
->pl
.param_type
))) {
1643 if (plist
->pl
.param_flag
& INDIRECT_PARAM
) {
1644 ss_ProcTail_frees(plist
->scode
, &somefrees
);
1652 f_print(fout
, ")\n");
1653 f_print(fout
, "\t\tz_result = RXGEN_SS_XDRFREE;\n\n");
1657 f_print(fout
, "\tif (rx_enable_stats) {\n");
1658 f_print(fout
, "\t rx_RecordCallStatistics(z_call,");
1659 if (PackageStatIndex
[PackageIndex
]) {
1660 f_print(fout
, " %s,\n", PackageStatIndex
[PackageIndex
]);
1663 "\n\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
1664 "\t\t((afs_uint32)ntohs(rx_ServiceOf(rx_ConnectionOf(z_call))->servicePort))),\n");
1666 f_print(fout
, "\t\t%d, %sNO_OF_STAT_FUNCS, 0);\n",
1667 no_of_stat_funcs
, PackagePrefix
[PackageIndex
]);
1668 f_print(fout
, "\t}\n\n");
1671 f_print(fout
, "\treturn z_result;\n");
1672 f_print(fout
, "}\n\n");
1677 ucs_ProcName_setup(definition
* defp
, char *procheader
, int split_flag
)
1683 f_print(fout
, "int %s%s%s%s(struct ubik_client *aclient, afs_int32 aflags",
1684 procheader
, prefix
, PackagePrefix
[PackageIndex
],
1685 defp
->pc
.proc_name
);
1687 f_print(fout
, "int %s%s%s%s(aclient, aflags", procheader
, prefix
,
1688 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1691 if ((strlen(procheader
) + strlen(prefix
) +
1692 strlen(PackagePrefix
[PackageIndex
]) + strlen(defp
->pc
.proc_name
)) >=
1693 MAX_FUNCTION_NAME_LEN
) {
1694 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1697 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1698 if (plist
->component_kind
== DEF_PARAM
) {
1701 if (plist
->pl
.param_kind
== DEF_INPARAM
&&
1702 strcmp(plist
->pl
.param_type
, "char *") == 0) {
1703 f_print(fout
, "const ");
1705 if (plist
->pl
.param_flag
& OUT_STRING
) {
1706 f_print(fout
, "%s *%s", plist
->pl
.param_type
,
1707 plist
->pl
.param_name
);
1709 f_print(fout
, "%s %s", plist
->pl
.param_type
,
1710 plist
->pl
.param_name
);
1713 plist
->pl
.param_flag
&= ~PROCESSED_PARAM
;
1714 f_print(fout
, " %s", plist
->pl
.param_name
);
1718 f_print(fout
, ")\n");
1724 ucs_ProcParams_setup(definition
* defp
, int split_flag
)
1726 proc1_list
*plist
, *plist1
;
1731 f_print(fout
, "\tstruct ubik_client *aclient;\n\tafs_int32 aflags;\n");
1732 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1733 if (plist
->component_kind
== DEF_PARAM
1734 && !(plist
->pl
.param_flag
& PROCESSED_PARAM
)) {
1735 if (plist
->pl
.param_flag
& OUT_STRING
) {
1736 f_print(fout
, "\t%s *%s", plist
->pl
.param_type
,
1737 plist
->pl
.param_name
);
1739 f_print(fout
, "\t%s %s", plist
->pl
.param_type
,
1740 plist
->pl
.param_name
);
1742 plist
->pl
.param_flag
|= PROCESSED_PARAM
;
1743 for (plist1
= defp
->pc
.plists
; plist1
; plist1
= plist1
->next
) {
1744 if ((plist1
->component_kind
== DEF_PARAM
)
1745 && streq(plist
->pl
.param_type
, plist1
->pl
.param_type
)
1746 && !(plist1
->pl
.param_flag
& PROCESSED_PARAM
)) {
1748 char *pntr
= strchr(plist1
->pl
.param_type
, '*');
1751 if (plist1
->pl
.param_flag
& OUT_STRING
) {
1752 f_print(fout
, ", *%s%s", star
, plist1
->pl
.param_name
);
1754 f_print(fout
, ", %s%s", star
, plist1
->pl
.param_name
);
1756 plist1
->pl
.param_flag
|= PROCESSED_PARAM
;
1759 f_print(fout
, ";\n");
1765 ucs_ProcTail_setup(definition
* defp
, int split_flag
)
1769 f_print(fout
, "{\tafs_int32 rcode, code, newHost, thisHost, i, _ucount;\n");
1770 f_print(fout
, "\tint chaseCount, pass, needsync;\n");
1771 #if 0 /* goes with block below */
1772 f_print(fout
, "\tint j, inlist;\n");
1774 f_print(fout
, "\tstruct rx_connection *tc;\n");
1775 f_print(fout
, "\tstruct rx_peer *rxp;\n");
1776 f_print(fout
, "\tshort origLevel;\n\n");
1777 f_print(fout
, "\tif (!aclient)\n");
1778 f_print(fout
, "\t\treturn UNOENT;\n");
1779 f_print(fout
, "\tLOCK_UBIK_CLIENT(aclient);\n\n");
1780 f_print(fout
, "\t restart:\n");
1781 f_print(fout
, "\torigLevel = aclient->initializationState;\n");
1782 f_print(fout
, "\trcode = UNOSERVERS;\n");
1783 f_print(fout
, "\tchaseCount = needsync = 0;\n\n");
1784 #if 0 /* We should do some sort of caching algorithm for this, but I need to think about it - shadow 26 jun 06 */
1785 f_print(fout
, "\tinlist = 0;\n");
1786 f_print(fout
, "\tLOCK_UCLNT_CACHE;\n");
1787 f_print(fout
, "\tfor (j = 0; ((j < SYNCCOUNT) && calls_needsync[j]); j++) {\n");
1788 f_print(fout
, "\t\tif (calls_needsync[j] == (int *)%s%s%s) {\n", prefix
, PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1789 f_print(fout
, "\t\t\tinlist = needsync = 1;\n");
1790 f_print(fout
, "\t\t\tbreak;\n");
1791 f_print(fout
, "\t\t}\n");
1792 f_print(fout
, "\t}\n");
1793 f_print(fout
, "\tUNLOCK_UCLNT_CACHE;\n");
1795 f_print(fout
, "\t/* \n\t* First pass, we try all servers that are up.\n\t* Second pass, we try all servers.\n\t*/\n");
1796 f_print(fout
, "\tfor (pass = 0; pass < 2; pass++) { /*p */\n");
1797 f_print(fout
, "\t\t/* For each entry in our servers list */\n");
1798 f_print(fout
, "\t\tfor (_ucount = 0;; _ucount++) { /*s */\n\n");
1799 f_print(fout
, "\t\tif (needsync) {\n");
1800 f_print(fout
, "\t\t\t/* Need a sync site. Lets try to quickly find it */\n");
1801 f_print(fout
, "\t\t\tif (aclient->syncSite) {\n");
1802 f_print(fout
, "\t\t\t\tnewHost = aclient->syncSite; /* already in network order */\n");
1803 f_print(fout
, "\t\t\t\taclient->syncSite = 0; /* Will reset if it works */\n");
1804 f_print(fout
, "\t\t\t} else if (aclient->conns[3]) {\n");
1805 f_print(fout
, "\t\t\t\t/* If there are fewer than four db servers in a cell,\n");
1806 f_print(fout
, "\t\t\t\t* there's no point in making the GetSyncSite call.\n");
1807 f_print(fout
, "\t\t\t\t* At best, it's a wash. At worst, it results in more\n");
1808 f_print(fout
, "\t\t\t\t* RPCs than you would otherwise make.\n");
1809 f_print(fout
, "\t\t\t\t*/\n");
1810 f_print(fout
, "\t\t\t\ttc = aclient->conns[_ucount];\n");
1811 f_print(fout
, "\t\t\t\tif (tc && rx_ConnError(tc)) {\n");
1812 f_print(fout
, "\t\t\t\t\taclient->conns[_ucount] = tc = ubik_RefreshConn(tc);\n");
1813 f_print(fout
, "\t\t\t\t}\n");
1814 f_print(fout
, "\t\t\t\tif (!tc)\n");
1815 f_print(fout
, "\t\t\t\t\tbreak;\n");
1816 f_print(fout
, "\t\t\t\tcode = VOTE_GetSyncSite(tc, &newHost);\n");
1817 f_print(fout
, "\t\t\t\tif (aclient->initializationState != origLevel)\n");
1818 f_print(fout
, "\t\t\t\t\tgoto restart; /* somebody did a ubik_ClientInit */\n");
1819 f_print(fout
, "\t\t\t\tif (code)\n");
1820 f_print(fout
, "\t\t\t\t\tnewHost = 0;\n");
1821 f_print(fout
, "\t\t\t\tnewHost = htonl(newHost); /* convert to network order */\n");
1822 f_print(fout
, "\t\t\t} else {\n");
1823 f_print(fout
, "\t\t\t\tnewHost = 0;\n");
1824 f_print(fout
, "\t\t\t}\n");
1825 f_print(fout
, "\t\t\tif (newHost) {\n");
1826 f_print(fout
, "\t\t\t\t/* position count at the appropriate slot in the client\n");
1827 f_print(fout
, "\t\t\t\t* structure and retry. If we can't find in slot, we'll\n");
1828 f_print(fout
, "\t\t\t\t* just continue through the whole list \n");
1829 f_print(fout
, "\t\t\t\t*/\n");
1830 f_print(fout
, "\t\t\t\tfor (i = 0; i < MAXSERVERS && aclient->conns[i]; i++) {\n");
1831 f_print(fout
, "\t\t\t\t\trxp = rx_PeerOf(aclient->conns[i]);\n");
1832 f_print(fout
, "\t\t\t\t\tthisHost = rx_HostOf(rxp);\n");
1833 f_print(fout
, "\t\t\t\t\tif (!thisHost)\n");
1834 f_print(fout
, "\t\t\t\t\t\tbreak;\n");
1835 f_print(fout
, "\t\t\t\t\tif (thisHost == newHost) {\n");
1836 f_print(fout
, "\t\t\t\t\t\tif (chaseCount++ > 2)\n");
1837 f_print(fout
, "\t\t\t\t\t\t\tbreak; /* avoid loop asking */\n");
1838 f_print(fout
, "\t\t\t\t\t\t_ucount = i; /* this index is the sync site */\n");
1839 f_print(fout
, "\t\t\t\t\t\tbreak;\n");
1840 f_print(fout
, "\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n");
1841 f_print(fout
, "\t\t/*needsync */\n");
1842 f_print(fout
, "\t\ttc = aclient->conns[_ucount];\n");
1843 f_print(fout
, "\t\tif (tc && rx_ConnError(tc)) {\n");
1844 f_print(fout
, "\t\t\taclient->conns[_ucount] = tc = ubik_RefreshConn(tc);\n");
1845 f_print(fout
, "\t\t}\n");
1846 f_print(fout
, "\t\tif (!tc)\n");
1847 f_print(fout
, "\t\t\tbreak;\n\n");
1848 f_print(fout
, "\t\tif ((pass == 0) && (aclient->states[_ucount] & CFLastFailed)) {\n");
1849 f_print(fout
, "\t\t\tcontinue; /* this guy's down */\n");
1850 f_print(fout
, "\t\t}\n");
1852 f_print(fout
, "\t\trcode = %s%s%s(tc\n", prefix
, PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1853 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
1854 if (plist
->component_kind
== DEF_PARAM
) {
1855 plist
->pl
.param_flag
&= ~PROCESSED_PARAM
;
1856 f_print(fout
, ", %s", plist
->pl
.param_name
);
1859 f_print(fout
, ");\n");
1860 f_print(fout
, "\t\tif (aclient->initializationState != origLevel) {\n");
1861 f_print(fout
, "\t\t\t/* somebody did a ubik_ClientInit */\n");
1862 f_print(fout
, "\t\t\tif (rcode)\n");
1863 f_print(fout
, "\t\t\t\tgoto restart; /* call failed */\n");
1864 f_print(fout
, "\t\t\telse\n");
1865 f_print(fout
, "\t\t\t\tgoto done; /* call suceeded */\n");
1866 f_print(fout
, "\t\t}\n");
1867 f_print(fout
, "\t\tif (rcode < 0) { /* network errors */\n");
1868 f_print(fout
, "\t\t\taclient->states[_ucount] |= CFLastFailed; /* Mark server down */\n");
1869 f_print(fout
, "\t\t} else if (rcode == UNOTSYNC) {\n");
1870 f_print(fout
, "\t\t\tneedsync = 1;\n");
1871 f_print(fout
, "\t\t} else if (rcode != UNOQUORUM) {\n");
1872 f_print(fout
, "\t\t\t/* either misc ubik code, or misc appl code, or success. */\n");
1873 f_print(fout
, "\t\t\taclient->states[_ucount] &= ~CFLastFailed; /* mark server up*/\n");
1874 f_print(fout
, "\t\t\tgoto done; /* all done */\n");
1875 f_print(fout
, "\t\t}\n");
1876 f_print(fout
, "\t\t} /*s */\n");
1877 f_print(fout
, "\t} /*p */\n\n");
1878 f_print(fout
, "\tdone:\n");
1879 f_print(fout
, "\tif (needsync) {\n");
1881 #if 0 /* We should do some sort of caching algorithm for this, but I need to think about it - shadow 26 jun 06 */
1882 f_print(fout
, "\t\tif (!inlist) { /* Remember proc call that needs sync site */\n");
1883 f_print(fout
, "\t\t\tLOCK_UCLNT_CACHE;\n");
1884 f_print(fout
, "\t\t\tcalls_needsync[synccount % SYNCCOUNT] = (int *)%s%s%s;\n", prefix
, PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
1885 f_print(fout
, "\t\t\tsynccount++;\n");
1886 f_print(fout
, "\t\t\tUNLOCK_UCLNT_CACHE;\n");
1887 f_print(fout
, "\t\t\tinlist = 1;\n");
1888 f_print(fout
, "\t\t}\n");
1890 f_print(fout
, "\t\tif (!rcode) { /* Remember the sync site - cmd successful */\n");
1891 f_print(fout
, "\t\t\trxp = rx_PeerOf(aclient->conns[_ucount]);\n");
1892 f_print(fout
, "\t\t\taclient->syncSite = rx_HostOf(rxp);\n");
1893 f_print(fout
, "\t\t}\n");
1894 f_print(fout
, "\t}\n");
1895 f_print(fout
, "\tUNLOCK_UBIK_CLIENT(aclient);\n");
1896 f_print(fout
, "\treturn rcode;\n}\n\n");
1901 opcode_holes_exist(void)
1905 for (i
= lowest_opcode
[PackageIndex
]; i
< highest_opcode
[PackageIndex
];
1907 if (!opcodenum_is_defined(i
))
1915 er_Proc_CodeGeneration(void)
1919 temp
= PackageIndex
;
1920 if (!combinepackages
)
1922 for (; PackageIndex
<= temp
; PackageIndex
++) {
1923 if (proc_defined
[PackageIndex
] == NULL
)
1925 if (combinepackages
|| opcode_holes_exist()) {
1926 er_HeadofOldStyleProc_setup();
1927 er_BodyofOldStyleProc_setup();
1928 er_TailofOldStyleProc_setup();
1929 er_HeadofOldStyleProc_setup2();
1930 er_BodyofOldStyleProc_setup2();
1931 er_TailofOldStyleProc_setup2();
1933 er_ProcDeclExterns_setup();
1934 er_ProcProcsArray_setup();
1935 er_ProcMainBody_setup();
1938 PackageIndex
= temp
;
1943 er_ProcDeclExterns_setup(void)
1951 f_print(fout
, "\n");
1952 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
1953 listp
= listp
->next
) {
1954 defp
= (definition
*) listp
->val
;
1955 if (defp
->pc
.proc_serverstub
) {
1956 f_print(fout
, "afs_int32 %s();\n", defp
->pc
.proc_serverstub
);
1963 er_ProcProcsArray_setup(void)
1968 if ((listp
= proc_defined
[PackageIndex
])) {
1969 defp
= (definition
*) listp
->val
;
1971 f_print(fout
, "\nstatic char *opnames%d[] = {\"%s%s\"",
1972 PackageIndex
, defp
->pc
.proc_prefix
, defp
->pc
.proc_name
);
1975 if (defp
->pc
.proc_serverstub
) {
1976 f_print(fout
, "\nstatic afs_int32 (*StubProcsArray%d[])() = {%s",
1977 PackageIndex
, defp
->pc
.proc_serverstub
);
1980 "\nstatic afs_int32 (*StubProcsArray%d[])(struct rx_call *z_call, XDR *z_xdrs) = {_%s%s%s",
1981 PackageIndex
, prefix
, defp
->pc
.proc_prefix
,
1982 ((definition
*) listp
->val
)->pc
.proc_name
);
1985 listp
= listp
->next
;
1987 for (; listp
!= NULL
; listp
= listp
->next
) {
1988 defp
= (definition
*) listp
->val
;
1990 f_print(fout
, ", \"%s%s\"",defp
->pc
.proc_prefix
,defp
->pc
.proc_name
);
1993 if (defp
->pc
.proc_serverstub
) {
1994 f_print(fout
, ",%s", defp
->pc
.proc_serverstub
);
1996 f_print(fout
, ", _%s%s%s", prefix
, defp
->pc
.proc_prefix
,
1997 defp
->pc
.proc_name
);
2001 f_print(fout
, "};\n\n");
2006 er_ProcMainBody_setup(void)
2009 f_print(fout
, "char *%sTranslateOpCode(int op)\n{\n",
2010 PackagePrefix
[PackageIndex
]);
2011 f_print(fout
, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
2012 PackagePrefix
[PackageIndex
], PackagePrefix
[PackageIndex
]);
2013 f_print(fout
, "\treturn opnames%d[op - %sLOWEST_OPCODE];\n}\n",
2014 PackageIndex
, PackagePrefix
[PackageIndex
]);
2015 f_print(fout
, "struct %sstats *%sOpCodeStats(int op)\n{\n",
2016 PackagePrefix
[PackageIndex
], PackagePrefix
[PackageIndex
]);
2017 f_print(fout
, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
2018 PackagePrefix
[PackageIndex
], PackagePrefix
[PackageIndex
]);
2019 f_print(fout
, "\treturn NULL;/*%d %s*/\n}\n",
2020 PackageIndex
, PackagePrefix
[PackageIndex
]);
2024 f_print(fout
, "int %s%sExecuteRequest(struct rx_call *z_call)\n",
2025 prefix
, PackagePrefix
[PackageIndex
]);
2026 f_print(fout
, "{\n\tint op;\n");
2027 f_print(fout
, "\tXDR z_xdrs;\n");
2028 f_print(fout
, "\t" "afs_int32 z_result;\n\n");
2029 f_print(fout
, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
2031 "\tif (!xdr_int(&z_xdrs, &op))\n\t\tz_result = RXGEN_DECODE;\n");
2033 "\telse if (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\tz_result = RXGEN_OPCODE;\n",
2034 PackagePrefix
[PackageIndex
], PackagePrefix
[PackageIndex
]);
2036 "\telse\n\t\tz_result = (*StubProcsArray%d[op - %sLOWEST_OPCODE])(z_call, &z_xdrs);\n",
2037 PackageIndex
, PackagePrefix
[PackageIndex
]);
2038 f_print(fout
, "\treturn hton_syserr_conv(z_result);\n}\n");
2042 er_HeadofOldStyleProc_setup2(void)
2045 f_print(fout
, "int %sOpCodeIndex(int op)\n{\n", (combinepackages
? MasterPrefix
: PackagePrefix
[PackageIndex
]));
2046 f_print(fout
, "\tswitch (op) {\n");
2051 er_HeadofOldStyleProc_setup(void)
2054 f_print(fout
, "char *%sTranslateOpCode(int op)\n{\n",
2055 (combinepackages
? MasterPrefix
: PackagePrefix
[PackageIndex
]));
2059 "\nint %s%sExecuteRequest (struct rx_call *z_call)\n",
2061 (combinepackages
? MasterPrefix
: PackagePrefix
[PackageIndex
]));
2062 f_print(fout
, "{\n");
2063 f_print(fout
, "\tint op;\n");
2064 f_print(fout
, "\tXDR z_xdrs;\n");
2065 f_print(fout
, "\t" "afs_int32 z_result;\n\n");
2066 f_print(fout
, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
2067 f_print(fout
, "\tz_result = RXGEN_DECODE;\n");
2068 f_print(fout
, "\tif (!xdr_int(&z_xdrs, &op)) goto fail;\n");
2070 f_print(fout
, "\tswitch (op) {\n");
2074 er_BodyofOldStyleProc_setup(void)
2078 if (combinepackages
) {
2079 int temp
= PackageIndex
;
2080 for (PackageIndex
= 0; PackageIndex
<= temp
; PackageIndex
++) {
2081 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
2082 listp
= listp
->next
)
2083 proc_er_case((definition
*) listp
->val
);
2085 PackageIndex
= temp
;
2087 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
2088 listp
= listp
->next
)
2089 proc_er_case((definition
*) listp
->val
);
2095 proc_er_case(definition
* defp
)
2098 f_print(fout
, "\t\tcase %d:", defp
->pc
.proc_opcodenum
);
2099 f_print(fout
, "\treturn \"%s%s\";\n",
2100 defp
->pc
.proc_prefix
, defp
->pc
.proc_name
);
2103 if (opcodesnotallowed
[PackageIndex
]) {
2104 f_print(fout
, "\t\tcase %d:\n", defp
->pc
.proc_opcodenum
);
2106 f_print(fout
, "\t\tcase %s:\n", defp
->pc
.proc_opcodename
);
2108 if (defp
->pc
.proc_serverstub
) {
2109 f_print(fout
, "\t\t\tz_result = %s(z_call, &z_xdrs);\n",
2110 defp
->pc
.proc_serverstub
);
2112 f_print(fout
, "\t\t\tz_result = _%s%s%s(z_call, &z_xdrs);\n", prefix
,
2113 defp
->pc
.proc_prefix
, defp
->pc
.proc_name
);
2115 f_print(fout
, "\t\t\tbreak;\n");
2119 proc_op_case(definition
* defp
)
2121 f_print(fout
, "\t\tcase %d:", defp
->pc
.proc_opcodenum
);
2122 f_print(fout
, "\treturn %d;\n",
2127 er_BodyofOldStyleProc_setup2(void)
2133 if (combinepackages
) {
2134 int temp
= PackageIndex
;
2135 for (PackageIndex
= 0; PackageIndex
<= temp
; PackageIndex
++) {
2136 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
2137 listp
= listp
->next
)
2138 proc_op_case((definition
*) listp
->val
);
2140 PackageIndex
= temp
;
2142 for (listp
= proc_defined
[PackageIndex
]; listp
!= NULL
;
2143 listp
= listp
->next
)
2144 proc_op_case((definition
*) listp
->val
);
2149 er_TailofOldStyleProc_setup2(void)
2152 f_print(fout
, "\t\tdefault:\n");
2153 f_print(fout
, "\t\t\treturn -1;\n\t}\n}\n");
2158 er_TailofOldStyleProc_setup(void)
2160 f_print(fout
, "\t\tdefault:\n");
2162 f_print(fout
, "\t\t\treturn NULL;\n\t}\n}\n");
2165 f_print(fout
, "\t\t\tz_result = RXGEN_OPCODE;\n");
2166 f_print(fout
, "\t\t\tbreak;\n\t}\n");
2167 f_print(fout
, "fail:\n");
2168 f_print(fout
, "\treturn z_result;\n}\n");
2172 h_ProcMainBody_setup(void)
2174 f_print(fout
,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
2175 prefix
, PackagePrefix
[PackageIndex
]);
2179 h_HeadofOldStyleProc_setup(void)
2181 char *pprefix
= (combinepackages
? MasterPrefix
:
2182 PackagePrefix
[PackageIndex
]);
2183 f_print(fout
,"\nstruct %sstats{\n\tint statsver;\n};", pprefix
);
2184 f_print(fout
,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
2186 f_print(fout
,"\nextern int %sOpCodeIndex(int op);\n", PackagePrefix
[PackageIndex
]);
2190 h_Proc_CodeGeneration(void)
2194 temp
= PackageIndex
;
2195 if (!combinepackages
)
2197 for (; PackageIndex
<= temp
; PackageIndex
++) {
2198 if (combinepackages
|| opcode_holes_exist()) {
2199 h_HeadofOldStyleProc_setup();
2201 h_ProcMainBody_setup();
2204 PackageIndex
= temp
;
2208 proc_h_case(definition
* defp
)
2210 f_print(fout
, "#define opcode_%s%s \t((afs_uint64)((%uLL << 32) + %sOpCodeIndex(%u)))\n",
2211 defp
->pc
.proc_prefix
, defp
->pc
.proc_name
, StatIndex
,
2212 defp
->pc
.proc_prefix
, defp
->pc
.proc_opcodenum
);
2216 h_opcode_stats_pkg(char *pprefix
, int lowest
, int highest
, int nops
,
2217 int statfuncs
, char *ptype
, list
*proclist
)
2225 "\n/* Opcode-related useful stats for %spackage: %s */\n",
2227 f_print(fout
, "#define %sLOWEST_OPCODE %d\n", pprefix
, lowest
);
2228 f_print(fout
, "#define %sHIGHEST_OPCODE %d\n", pprefix
, highest
);
2229 f_print(fout
, "#define %sNUMBER_OPCODES %d\n\n", pprefix
, nops
);
2231 for (listp
= proclist
; listp
!= NULL
;
2232 listp
= listp
->next
)
2233 proc_h_case((definition
*) listp
->val
);
2236 f_print(fout
, "#define %sNO_OF_STAT_FUNCS\t%d\n\n",
2237 pprefix
, statfuncs
);
2238 f_print(fout
, "AFS_RXGEN_EXPORT\n");
2239 f_print(fout
, "extern const char *%sfunction_names[];\n\n",
2245 h_opcode_stats(void)
2247 if (combinepackages
) {
2248 h_opcode_stats_pkg(MasterPrefix
, master_lowest_opcode
, master_highest_opcode
, master_no_of_opcodes
, no_of_stat_funcs_header
[0], "Master ", proc_defined
[0]);
2251 for (i
= 0; i
<= PackageIndex
; i
++) {
2252 h_opcode_stats_pkg(PackagePrefix
[i
], lowest_opcode
[i
], highest_opcode
[i
], no_of_opcodes
[i
], no_of_stat_funcs_header
[i
], "", proc_defined
[i
]);
2259 generate_multi_macros(definition
* defp
)
2261 char *startname
= SplitStart
, *endname
= SplitEnd
;
2270 f_print(fout
, "\n#include <rx/rx_multi.h>");
2272 f_print(fout
, "\n#define multi_%s%s(", PackagePrefix
[PackageIndex
],
2273 defp
->pc
.proc_name
);
2274 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
2275 if (plist
->component_kind
== DEF_PARAM
) {
2278 f_print(fout
, "%s", plist
->pl
.param_name
);
2280 f_print(fout
, ", %s", plist
->pl
.param_name
);
2284 f_print(fout
, ") \\\n");
2286 startname
= "Start";
2289 f_print(fout
, "\tmulti_Body(%s%s%s(multi_call", startname
,
2290 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
2291 do_split(defp
, OUT
, &numofparams
, DEF_OUTPARAM
, 0);
2292 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
2293 if (plist
->component_kind
== DEF_PARAM
)
2294 f_print(fout
, ", %s", plist
->pl
.param_name
);
2296 do_split(defp
, OUT
, &numofparams
, DEF_OUTPARAM
, 1);
2297 f_print(fout
, "), %s%s%s(multi_call", endname
,
2298 PackagePrefix
[PackageIndex
], defp
->pc
.proc_name
);
2299 do_split(defp
, IN
, &numofparams
, DEF_INPARAM
, 0);
2300 for (plist
= defp
->pc
.plists
; plist
; plist
= plist
->next
) {
2301 if (plist
->component_kind
== DEF_PARAM
) {
2302 f_print(fout
, ", %s", plist
->pl
.param_name
);
2305 do_split(defp
, IN
, &numofparams
, DEF_INPARAM
, 1);
2306 f_print(fout
, "))\n\n");
2311 IsRxgenToken(token
* tokp
)
2313 if (tokp
->kind
== TOK_PACKAGE
|| tokp
->kind
== TOK_PREFIX
2314 || tokp
->kind
== TOK_SPECIAL
|| tokp
->kind
== TOK_STARTINGOPCODE
2315 || tokp
->kind
== TOK_SPLITPREFIX
|| tokp
->kind
== TOK_PROC
2316 || tokp
->kind
== TOK_STATINDEX
)
2322 IsRxgenDefinition(definition
* def
)
2324 if (def
->def_kind
== DEF_PACKAGE
|| def
->def_kind
== DEF_PREFIX
2325 || def
->def_kind
== DEF_SPECIAL
|| def
->def_kind
== DEF_STARTINGOPCODE
2326 || def
->def_kind
== DEF_SPLITPREFIX
|| def
->def_kind
== DEF_PROC
)