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_ProcCallback_setup(definition * defp, char *cbheader);
129 static void ucs_ProcName_setup(definition * defp, char *procheader,
131 static void ucs_ProcParams_setup(definition * defp, int split_flag);
132 static void ucs_ProcTail_setup(definition * defp, char *cbheader,
134 static void ss_Proc_CodeGeneration(definition * defp);
135 static void ss_ProcName_setup(definition * defp);
136 static void ss_ProcParams_setup(definition * defp);
137 static void ss_ProcSpecial_setup(definition * defp);
138 static void ss_ProcUnmarshallInParams_setup(definition * defp);
139 static void ss_ProcCallRealProc_setup(definition * defp);
140 static void ss_ProcMarshallOutParams_setup(definition * defp);
141 static void ss_ProcTail_setup(definition * defp);
142 static int opcode_holes_exist(void);
143 static void er_ProcDeclExterns_setup(void);
144 static void er_ProcProcsArray_setup(void);
145 static void er_ProcMainBody_setup(void);
146 static void er_HeadofOldStyleProc_setup(void);
147 static void er_HeadofOldStyleProc_setup2(void);
148 static void er_BodyofOldStyleProc_setup(void);
149 static void er_BodyofOldStyleProc_setup2(void);
150 static void proc_er_case(definition * defp);
151 static void er_TailofOldStyleProc_setup(void);
152 static void er_TailofOldStyleProc_setup2(void);
157 * return the next definition you see
165 defp = ALLOC(definition);
166 memset(defp, 0, sizeof(definition));
199 def_special(&dec, defp);
202 case TOK_STARTINGOPCODE:
203 def_startingopcode(defp);
208 customize_struct(defp);
210 case TOK_SPLITPREFIX:
215 if (tok.kind == TOK_LPAREN) {
217 check_proc(defp, &tok, 1);
219 check_proc(defp, &tok, 0);
222 check_proc(defp, &tok, 0);
226 check_proc(defp, &tok, 1);
229 error("definition keyword expected");
231 if (!IsRxgenToken(&tok)) {
232 scan(TOK_SEMICOLON, &tok);
240 isdefined(definition * defp)
242 STOREVAL(&defined, defp);
247 def_struct(definition * defp)
255 defp->def_kind = DEF_STRUCT;
257 scan(TOK_IDENT, &tok);
258 defp->def_name = tok.str;
259 scan(TOK_LBRACE, &tok);
260 tailp = &defp->def.st.decls;
262 get_declaration(&dec, DEF_STRUCT);
263 /* If a structure contains an array, then we're going
264 * to need to be clever about freeing it */
265 if (dec.rel == REL_ARRAY) {
268 decls = ALLOC(decl_list);
271 tailp = &decls->next;
272 scan(TOK_SEMICOLON, &tok);
274 } while (tok.kind != TOK_RBRACE);
279 STOREVAL(&complex_defined, defp);
283 def_enum(definition * defp)
287 enumval_list **tailp;
289 defp->def_kind = DEF_ENUM;
290 scan(TOK_IDENT, &tok);
291 defp->def_name = tok.str;
292 scan(TOK_LBRACE, &tok);
293 tailp = &defp->def.en.vals;
295 scan(TOK_IDENT, &tok);
296 elist = ALLOC(enumval_list);
297 elist->name = tok.str;
298 elist->assignment = NULL;
299 scan3(TOK_COMMA, TOK_RBRACE, TOK_EQUAL, &tok);
300 if (tok.kind == TOK_EQUAL) {
302 elist->assignment = tok.str;
303 scan2(TOK_COMMA, TOK_RBRACE, &tok);
306 tailp = &elist->next;
307 } while (tok.kind != TOK_RBRACE);
312 def_const(definition * defp)
316 defp->def_kind = DEF_CONST;
317 scan(TOK_IDENT, &tok);
318 defp->def_name = tok.str;
319 scan(TOK_EQUAL, &tok);
320 scan2(TOK_IDENT, TOK_STRCONST, &tok);
321 defp->def.co = tok.str;
325 def_union(definition * defp)
332 defp->def_kind = DEF_UNION;
333 scan(TOK_IDENT, &tok);
334 defp->def_name = tok.str;
335 scan(TOK_SWITCH, &tok);
336 scan(TOK_LPAREN, &tok);
337 get_declaration(&dec, DEF_UNION);
338 defp->def.un.enum_decl = dec;
339 tailp = &defp->def.un.cases;
340 scan(TOK_RPAREN, &tok);
341 scan(TOK_LBRACE, &tok);
342 scan(TOK_CASE, &tok);
343 while (tok.kind == TOK_CASE) {
344 scan(TOK_IDENT, &tok);
345 cases = ALLOC(case_list);
346 cases->case_name = tok.str;
347 scan(TOK_COLON, &tok);
348 get_declaration(&dec, DEF_UNION);
349 cases->case_decl = dec;
351 tailp = &cases->next;
352 scan(TOK_SEMICOLON, &tok);
353 scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
356 if (tok.kind == TOK_DEFAULT) {
357 scan(TOK_COLON, &tok);
358 get_declaration(&dec, DEF_UNION);
359 defp->def.un.default_decl = ALLOC(declaration);
360 *defp->def.un.default_decl = dec;
361 scan(TOK_SEMICOLON, &tok);
362 scan(TOK_RBRACE, &tok);
364 defp->def.un.default_decl = NULL;
370 def_typedef(definition * defp)
374 memset(&dec, 0, sizeof(dec));
376 defp->def_kind = DEF_TYPEDEF;
377 get_declaration(&dec, DEF_TYPEDEF);
378 defp->def_name = dec.name;
379 defp->def.ty.old_prefix = dec.prefix;
380 defp->def.ty.old_type = dec.type;
381 defp->def.ty.rel = dec.rel;
382 defp->def.ty.array_max = dec.array_max;
387 get_declaration(declaration * dec, defkind dkind)
391 get_type(&dec->prefix, &dec->type, dkind);
392 dec->rel = REL_ALIAS;
393 if (streq(dec->type, "void")) {
396 scan2(TOK_STAR, TOK_IDENT, &tok);
397 if (tok.kind == TOK_STAR) {
398 dec->rel = REL_POINTER;
399 scan(TOK_IDENT, &tok);
402 if (peekscan(TOK_LBRACKET, &tok)) {
403 if (dec->rel == REL_POINTER) {
404 error("no array-of-pointer declarations -- use typedef");
406 dec->rel = REL_VECTOR;
408 dec->array_max = tok.str;
409 scan(TOK_RBRACKET, &tok);
410 } else if (peekscan(TOK_LANGLE, &tok)) {
411 if (dec->rel == REL_POINTER) {
412 error("no array-of-pointer declarations -- use typedef");
414 dec->rel = REL_ARRAY;
415 if (peekscan(TOK_RANGLE, &tok)) {
416 if ((dkind == DEF_INPARAM) || (dkind == DEF_INOUTPARAM)) {
417 error("input arrays must specify a max size");
419 dec->array_max = "~0u"; /* unspecified size, use max */
422 dec->array_max = tok.str;
423 scan(TOK_RANGLE, &tok);
426 if (streq(dec->type, "opaque")) {
427 if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR) {
428 error("array declaration expected");
430 } else if (streq(dec->type, "string")) {
431 if (dec->rel != REL_ARRAY) {
432 error(" variable-length array declaration expected");
439 get_type(char **prefixp, char **typep, defkind dkind)
453 scan(TOK_IDENT, &tok);
461 (void)peekscan(TOK_INT, &tok);
464 *typep = "afs_int32";
465 (void)peekscan(TOK_INT, &tok);
468 if (dkind != DEF_UNION) {
469 error("voids allowed only inside union definitions");
484 error("expected type specifier");
490 unsigned_dec(char **typep)
503 (void)peekscan(TOK_INT, &tok);
507 *typep = "afs_uint32";
508 (void)peekscan(TOK_INT, &tok);
522 def_package(definition * defp)
526 defp->def_kind = DEF_PACKAGE;
527 scan(TOK_IDENT, &tok);
528 defp->def_name = tok.str;
529 no_of_stat_funcs = 0;
532 if (PackageIndex >= MAX_PACKAGES)
533 error("Exceeded upper limit of package statements\n");
535 function_list_index = 0;
536 PackagePrefix[PackageIndex] = tok.str;
537 if (MasterPrefix == NULL)
538 MasterPrefix = tok.str;
539 no_of_opcodes[PackageIndex] = highest_opcode[PackageIndex] =
540 opcodesnotallowed[PackageIndex] = 0;
541 lowest_opcode[PackageIndex] = 99999;
542 proc_defined[PackageIndex] = NULL;
543 PackageStatIndex[PackageIndex] = NULL;
547 def_prefix(definition * defp)
551 defp->def_kind = DEF_PREFIX;
552 scan(TOK_IDENT, &tok);
553 defp->def_name = tok.str;
554 ServerPrefix = tok.str;
558 def_statindex(definition * defp)
563 defp->def_kind = DEF_CONST;
565 if (PackageIndex < 0)
566 error("'statindex' command must follow 'package' command!\n");
567 if (PackageStatIndex[PackageIndex])
568 error("Cannot have more then one 'statindex' per package!\n");
569 if (InvalidConstant(tok.str))
570 error("Index in 'statindex' command must be a constant!");
572 alloc(strlen(PackagePrefix[PackageIndex]) + strlen("STATINDEX") + 1);
573 strcpy(name, PackagePrefix[PackageIndex]);
574 strcat(name, "STATINDEX");
575 defp->def_name = name;
576 defp->def.co = tok.str;
577 PackageStatIndex[PackageIndex] = name;
578 StatIndex = atoi(tok.str);
582 def_startingopcode(definition * defp)
586 defp->def_kind = DEF_STARTINGOPCODE;
587 scan(TOK_IDENT, &tok);
588 defp->def_name = tok.str;
589 if (InvalidConstant(defp->def_name))
590 error("Opcode in 'startingopcode' command must be a constant!");
591 lowest_opcode[PackageIndex] = master_lowest_opcode = atoi(tok.str);
592 if (lowest_opcode[PackageIndex] < 0
593 || lowest_opcode[PackageIndex] > 99999)
595 ("startingopcode number is out of bounds (must be >= 0 < 100000)");
596 master_opcodenumber = lowest_opcode[PackageIndex];
597 opcodesnotallowed[PackageIndex] = 1;
601 def_split(definition * defp)
605 defp->def_kind = DEF_SPLITPREFIX;
610 scan(TOK_EQUAL, &tok);
611 scan(TOK_IDENT, &tok);
612 SplitStart = tok.str;
615 scan(TOK_EQUAL, &tok);
616 scan(TOK_IDENT, &tok);
622 error("syntax error in the 'splitprefix' line");
624 } while (tok.kind != TOK_SEMICOLON);
625 if (!SplitStart && !SplitEnd)
626 error("At least one param should be passed to 'splitprefix' cmd");
631 customize_struct(definition * defp)
635 definition *defp1 = ALLOC(definition);
636 spec_list *specs, **tailp;
638 defp->def_kind = DEF_CUSTOMIZED;
639 defp1->def_kind = DEF_SPECIAL;
640 tailp = &defp1->def.sd.specs;
641 for (listp = defp->def.st.decls; listp; listp = listp->next) {
643 if (streq(dec->type, "string") || (dec->rel == REL_POINTER)) {
644 specs = ALLOC(spec_list);
645 specs->sdef.string_name = dec->name;
646 specs->sdef.string_value = defp->def_name;
648 tailp = &specs->next;
652 STOREVAL(&special_defined, defp1);
656 structname(char *name)
658 static char namecontents[150];
661 strcpy(namecontents, name);
663 if (!strncmp(pnt, "struct", 6))
665 while (isspace(*pnt))
668 while (*pnt != ' ' && *pnt != '\0')
676 def_special(declaration * dec, definition * defp)
679 spec_list *specs, **tailp;
682 defp->def_kind = DEF_SPECIAL;
683 get_type(&dec->prefix, &dec->type, DEF_SPECIAL);
684 dec->rel = REL_POINTER;
685 scan(TOK_IDENT, &tok);
686 tailp = &defp->def.sd.specs;
688 specs = ALLOC(spec_list);
689 specs->sdef.string_name = tok.str;
690 get_param_type(defp, dec, &specs->sdef.string_value, &typename);
692 tailp = &specs->next;
693 scan2(TOK_COMMA, TOK_SEMICOLON, &tok);
694 if (tok.kind == TOK_SEMICOLON)
697 } while (tok.kind == TOK_IDENT);
699 STOREVAL(&special_defined, defp);
703 proc1_list *Proc_list, **Proc_listp;
706 check_proc(definition * defp, token * tokp, int noname)
712 if (PackageIndex < 0)
713 error("Procedure must be in a package!\n");
715 tokp->kind = TOK_PROC;
716 defp->def_kind = DEF_PROC;
718 defp->pc.proc_name = "";
720 defp->pc.proc_name = tokp->str;
722 defp->pc.proc_prefix = alloc(strlen(PackagePrefix[PackageIndex]) + 1);
723 strcpy(defp->pc.proc_prefix, PackagePrefix[PackageIndex]);
724 scan2(TOK_LPAREN, TOK_IDENT, &tok);
725 defp->pc.proc_serverstub = NULL;
726 if (tok.kind == TOK_IDENT) {
727 defp->pc.proc_serverstub = tok.str;
728 scan(TOK_LPAREN, &tok);
730 analyze_ProcParams(defp, &tok);
731 defp->pc.proc_opcodenum = -1;
732 scan4(TOK_SPLIT, TOK_MULTI, TOK_EQUAL, TOK_SEMICOLON, &tok);
733 if (tok.kind == TOK_MULTI) {
735 defp->pc.multi_flag = 1;
736 scan2(TOK_EQUAL, TOK_SEMICOLON, &tok);
738 defp->pc.multi_flag = 0;
740 if (tok.kind == TOK_SPLIT) {
742 defp->pc.split_flag = 1;
743 scan2(TOK_EQUAL, TOK_SEMICOLON, &tok);
745 defp->pc.split_flag = 0;
747 if (tok.kind == TOK_EQUAL) {
748 if (opcodesnotallowed[PackageIndex])
749 error("Opcode assignment isn't allowed here!");
751 if (InvalidConstant(tok.str))
752 error("Illegal Opcode assignment (Must be a constant opcode!)");
753 if (opcodenum_is_defined(atoi(tok.str)))
754 error("The opcode number is already used by a previous proc");
755 defp->pc.proc_opcodename = tok.str;
756 defp->pc.proc_opcodenum = atoi(tok.str);
757 if (defp->pc.proc_opcodenum < lowest_opcode[PackageIndex])
758 lowest_opcode[PackageIndex] = defp->pc.proc_opcodenum;
759 if (defp->pc.proc_opcodenum < master_lowest_opcode)
760 master_lowest_opcode = defp->pc.proc_opcodenum;
761 if (defp->pc.proc_opcodenum > highest_opcode[PackageIndex])
762 highest_opcode[PackageIndex] = defp->pc.proc_opcodenum;
763 if (defp->pc.proc_opcodenum > master_highest_opcode)
764 master_highest_opcode = defp->pc.proc_opcodenum;
765 scan(TOK_SEMICOLON, &tok);
767 if (master_opcodenumber == 99999)
768 master_opcodenumber = 0;
769 defp->pc.proc_opcodenum = master_opcodenumber++;
770 if (defp->pc.proc_opcodenum < lowest_opcode[PackageIndex])
771 lowest_opcode[PackageIndex] = defp->pc.proc_opcodenum;
772 if (defp->pc.proc_opcodenum > highest_opcode[PackageIndex])
773 highest_opcode[PackageIndex] = defp->pc.proc_opcodenum;
774 if (defp->pc.proc_opcodenum > master_highest_opcode)
775 master_highest_opcode = defp->pc.proc_opcodenum;
776 opcodesnotallowed[PackageIndex] = 1; /* force it */
778 no_of_opcodes[PackageIndex]++, master_no_of_opcodes++;
780 generate_code(defp, 0, 1);
781 if (Cflag || cflag) {
782 generate_code(defp, 1, 1);
784 generate_multi_macros(defp);
786 generate_code(defp, proc_split, 0);
789 if (function_list_index >= MAX_FUNCTIONS_PER_INTERFACE) {
790 error("too many functions in interface, "
791 "increase MAX_FUNCTIONS_PER_INTERFACE");
793 sprintf(function_list[PackageIndex][function_list_index], "%s%s%s",
794 prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
796 function_list_index++;
797 defp->statindex = no_of_stat_funcs;
798 no_of_stat_funcs_header[PackageIndex]++;
804 #define LEGALNUMS "0123456789"
806 InvalidConstant(char *name)
812 slen = (int)strlen(name);
813 return (slen != strspn(name, map));
817 opcodenum_is_defined(int opcode_num)
822 for (listp = proc_defined[PackageIndex]; listp != NULL;
823 listp = listp->next) {
824 defp = (definition *) listp->val;
825 if (opcode_num == defp->pc.proc_opcodenum)
833 analyze_ProcParams(definition * defp, token * tokp)
836 decl_list *decls, **tailp;
838 Proc_listp = &defp->pc.plists;
839 tailp = &defp->def.st.decls;
842 Proc_list = ALLOC(proc1_list);
843 memset(Proc_list, 0, sizeof(proc1_list));
844 Proc_list->pl.param_flag = 0;
845 switch (tokp->kind) {
847 hdle_param_tok(defp, &dec, tokp, DEF_INPARAM);
850 hdle_param_tok(defp, &dec, tokp, DEF_OUTPARAM);
853 hdle_param_tok(defp, &dec, tokp, DEF_INOUTPARAM);
859 hdle_param_tok(defp, &dec, tokp, DEF_NULL);
862 *Proc_listp = Proc_list;
863 Proc_listp = &Proc_list->next;
864 decls = ALLOC(decl_list);
865 memset(decls, 0, sizeof(decl_list));
866 if (tokp->kind != TOK_RPAREN)
869 tailp = &decls->next;
870 } while (tokp->kind != TOK_RPAREN);
876 generate_code(definition * defp, int proc_split_flag, int multi_flag)
879 handle_split_proc(defp, multi_flag);
881 if (Cflag || cflag) {
882 cs_Proc_CodeGeneration(defp, 0, "");
885 ss_Proc_CodeGeneration(defp);
887 if (Sflag || (cflag && xflag && !proc_split_flag) || hflag)
888 STOREVAL(&proc_defined[PackageIndex], defp);
893 handle_split_proc(definition * defp, int multi_flag)
895 char *startname = SplitStart, *endname = SplitEnd;
902 if (Cflag || cflag) {
904 do_split(defp, OUT, &numofparams, DEF_OUTPARAM, 0);
906 cs_Proc_CodeGeneration(defp, 1, startname);
908 do_split(defp, OUT, &numofparams, DEF_OUTPARAM, 1);
909 do_split(defp, IN, &numofparams, DEF_INPARAM, 0);
911 cs_Proc_CodeGeneration(defp, (multi_flag ? 3 : 2), endname);
913 do_split(defp, IN, &numofparams, DEF_INPARAM, 1);
917 ss_Proc_CodeGeneration(defp);
922 do_split(definition * defp, int direction, int *numofparams,
923 defkind param_kind, int restore_flag)
928 defp->pc.paramtypes[direction] = *numofparams;
929 for (plist = defp->pc.plists; plist; plist = plist->next) {
930 if (plist->component_kind == DEF_NULL
931 && plist->pl.param_kind == param_kind)
932 plist->component_kind = DEF_PARAM;
935 *numofparams = defp->pc.paramtypes[direction];
936 defp->pc.paramtypes[direction] = 0;
937 for (plist = defp->pc.plists; plist; plist = plist->next) {
938 if (plist->component_kind == DEF_PARAM
939 && plist->pl.param_kind == param_kind)
940 plist->component_kind = DEF_NULL;
947 hdle_param_tok(definition * defp, declaration * dec, token * tokp,
950 static defkind last_param_kind = DEF_NULL;
952 if (par_kind == DEF_NULL)
953 Proc_list->pl.param_kind = last_param_kind;
955 Proc_list->pl.param_kind = par_kind;
956 last_param_kind = Proc_list->pl.param_kind;
957 defp->pc.paramtypes[(int)last_param_kind]++;
958 Proc_list->component_kind = DEF_PARAM;
959 Proc_list->code = alloc(250);
960 Proc_list->scode = alloc(250);
961 get_declaration(dec, par_kind);
962 Proc_list->pl.param_name = dec->name;
963 get1_param_type(defp, dec, &Proc_list->pl.param_type);
965 scan2(TOK_COMMA, TOK_RPAREN, tokp);
966 if (tokp->kind == TOK_COMMA)
972 get1_param_type(definition * defp, declaration * dec, char **param_type)
974 char typecontents[100];
976 if (streq(dec->type, "string")) {
977 *param_type = "char *";
980 strcpy(typecontents, dec->prefix);
981 strcat(typecontents, " ");
982 strcat(typecontents, dec->type);
983 strcat(typecontents, " *");
984 } else if (dec->rel == REL_POINTER) {
985 strcpy(typecontents, dec->type);
986 strcat(typecontents, " *");
988 strcpy(typecontents, dec->type);
989 *param_type = alloc(100);
990 strcpy(*param_type, typecontents);
996 get_param_type(definition * defp, declaration * dec, char **param_type,
999 char typecontents[100];
1001 if (streq(dec->type, "string")) {
1002 *typename = "wrapstring";
1003 *param_type = "char *";
1005 *typename = dec->type;
1007 strcpy(typecontents, dec->prefix);
1008 strcat(typecontents, " ");
1009 strcat(typecontents, dec->type);
1010 strcat(typecontents, " *");
1011 dec->rel = REL_POINTER;
1012 } else if (dec->rel == REL_POINTER) {
1013 strcpy(typecontents, dec->type);
1014 strcat(typecontents, " *");
1016 strcpy(typecontents, dec->type);
1017 *param_type = alloc(100);
1018 strcpy(*param_type, typecontents);
1025 hndle_param_tail(definition * defp, declaration * dec, token * tokp,
1030 if (dec->rel == REL_POINTER)
1031 Proc_list->pl.param_flag |= INDIRECT_PARAM;
1033 Proc_list->pl.param_flag &= ~INDIRECT_PARAM;
1035 if (!(Proc_list->pl.param_flag & INDIRECT_PARAM))
1038 sprintf(Proc_list->code, "xdr_%s(&z_xdrs, %s%s)", typename, amp,
1039 Proc_list->pl.param_name);
1040 sprintf(Proc_list->scode, "xdr_%s(z_xdrs, &%s)", typename,
1041 Proc_list->pl.param_name);
1042 scan2(TOK_COMMA, TOK_RPAREN, tokp);
1043 if (tokp->kind == TOK_COMMA)
1050 cs_Proc_CodeGeneration(definition * defp, int split_flag, char *procheader)
1053 cs_ProcName_setup(defp, procheader, split_flag);
1055 cs_ProcParams_setup(defp, split_flag);
1056 cs_ProcMarshallInParams_setup(defp, split_flag);
1057 if (split_flag != 1) {
1058 cs_ProcSendPacket_setup(defp, split_flag);
1059 cs_ProcUnmarshallOutParams_setup(defp);
1061 cs_ProcTail_setup(defp, split_flag);
1064 if (!kflag && !split_flag && uflag) {
1066 ucs_ProcCallback_setup(defp, "ubik_call_");
1068 ucs_ProcName_setup(defp, "ubik_", split_flag);
1070 ucs_ProcParams_setup(defp, split_flag);
1071 ucs_ProcTail_setup(defp, "ubik_call_", split_flag);
1077 cs_ProcName_setup(definition * defp, char *procheader, int split_flag)
1084 first_arg = "struct rx_call *z_call";
1086 first_arg = "struct rx_connection *z_conn";
1090 first_arg = "z_call";
1092 first_arg = "z_conn";
1097 f_print(fout, "int %s%s%s%s(%s", procheader, prefix,
1098 PackagePrefix[PackageIndex], defp->pc.proc_name, first_arg);
1100 if ((strlen(procheader) + strlen(prefix) +
1101 strlen(PackagePrefix[PackageIndex]) + strlen(defp->pc.proc_name)) >=
1102 MAX_FUNCTION_NAME_LEN) {
1103 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1106 for (plist = defp->pc.plists; plist; plist = plist->next) {
1107 if (plist->component_kind == DEF_PARAM) {
1110 if (plist->pl.param_kind == DEF_INPARAM &&
1111 strcmp(plist->pl.param_type, "char *") == 0) {
1112 f_print(fout, "const ");
1114 if (plist->pl.param_flag & OUT_STRING) {
1115 f_print(fout, "%s *%s", plist->pl.param_type,
1116 plist->pl.param_name);
1118 f_print(fout, "%s %s", plist->pl.param_type,
1119 plist->pl.param_name);
1122 f_print(fout, " %s", plist->pl.param_name);
1123 plist->pl.param_flag &= ~PROCESSED_PARAM;
1127 f_print(fout, ")\n");
1132 cs_ProcParams_setup(definition * defp, int split_flag)
1134 proc1_list *plist, *plist1;
1140 f_print(fout, "\tstruct rx_connection *z_conn;\n");
1142 f_print(fout, "\tstruct rx_call *z_call;\n");
1144 for (plist = defp->pc.plists; plist; plist = plist->next) {
1145 if (plist->component_kind == DEF_PARAM
1146 && !(plist->pl.param_flag & PROCESSED_PARAM)) {
1147 if (plist->pl.param_flag & OUT_STRING) {
1148 f_print(fout, "\t%s *%s", plist->pl.param_type,
1149 plist->pl.param_name);
1151 f_print(fout, "\t%s %s", plist->pl.param_type,
1152 plist->pl.param_name);
1154 plist->pl.param_flag |= PROCESSED_PARAM;
1155 for (plist1 = defp->pc.plists; plist1; plist1 = plist1->next) {
1156 if ((plist1->component_kind == DEF_PARAM)
1157 && streq(plist->pl.param_type, plist1->pl.param_type)
1158 && !(plist1->pl.param_flag & PROCESSED_PARAM)) {
1160 char *pntr = strchr(plist1->pl.param_type, '*');
1163 if (plist1->pl.param_flag & OUT_STRING) {
1164 f_print(fout, ", *%s%s", star, plist1->pl.param_name);
1166 f_print(fout, ", %s%s", star, plist1->pl.param_name);
1168 plist1->pl.param_flag |= PROCESSED_PARAM;
1171 f_print(fout, ";\n");
1178 cs_ProcMarshallInParams_setup(definition * defp, int split_flag)
1180 int noofparams, i = 0;
1184 defp->pc.paramtypes[IN] + defp->pc.paramtypes[INOUT] +
1185 defp->pc.paramtypes[OUT];
1187 f_print(fout, "{\n");
1189 f_print(fout, "\tstruct rx_call *z_call = rx_NewCall(z_conn);\n");
1190 if ((!split_flag) || (split_flag == 1)) {
1191 if (opcodesnotallowed[PackageIndex]) {
1192 f_print(fout, "\tstatic int z_op = %d;\n",
1193 defp->pc.proc_opcodenum);
1195 f_print(fout, "\tstatic int z_op = %s;\n",
1196 defp->pc.proc_opcodename);
1199 f_print(fout, "\tint z_result;\n");
1200 if (!(split_flag > 1) || (noofallparams != 0)) {
1201 f_print(fout, "\tXDR z_xdrs;\n");
1204 if ((!split_flag) || (split_flag == 1)) {
1205 f_print(fout, "\txdrrx_create(&z_xdrs, z_call, XDR_ENCODE);\n");
1206 f_print(fout, "\n\t/* Marshal the arguments */\n");
1207 f_print(fout, "\tif ((!xdr_int(&z_xdrs, &z_op))");
1208 noofparams = defp->pc.paramtypes[IN] + defp->pc.paramtypes[INOUT];
1209 for (plist = defp->pc.plists, dl = defp->def.st.decls; plist;
1210 plist = plist->next, dl = dl->next) {
1211 if (plist->component_kind == DEF_PARAM
1212 && (plist->pl.param_kind == DEF_INPARAM
1213 || plist->pl.param_kind == DEF_INOUTPARAM)) {
1214 f_print(fout, "\n\t || (!%s)", plist->code);
1215 if (++i == noofparams) {
1217 ") {\n\t\tz_result = RXGEN_CC_MARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1224 ") {\n\t\tz_result = RXGEN_CC_MARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1232 cs_ProcSendPacket_setup(definition * defp, int split_flag)
1234 int noofoutparams = defp->pc.paramtypes[INOUT] + defp->pc.paramtypes[OUT];
1236 if (noofoutparams) {
1237 f_print(fout, "\t/* Un-marshal the reply arguments */\n");
1239 f_print(fout, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
1241 f_print(fout, "\tz_xdrs.x_op = XDR_DECODE;\n");
1248 cs_ProcUnmarshallOutParams_setup(definition * defp)
1254 noofparams = defp->pc.paramtypes[INOUT] + defp->pc.paramtypes[OUT];
1256 for (plist = defp->pc.plists, dl = defp->def.st.decls, i = 0; plist;
1257 plist = plist->next, dl = dl->next) {
1258 if (plist->component_kind == DEF_PARAM
1259 && (plist->pl.param_kind == DEF_OUTPARAM
1260 || plist->pl.param_kind == DEF_INOUTPARAM)) {
1262 f_print(fout, "\tif ((!%s)", plist->code);
1264 f_print(fout, "\n\t || (!%s)", plist->code);
1266 if (++i == noofparams) {
1268 ") {\n\t\tz_result = RXGEN_CC_UNMARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1277 cs_ProcTail_setup(definition * defp, int split_flag)
1279 f_print(fout, "\tz_result = RXGEN_SUCCESS;\n");
1280 if (defp->can_fail) {
1281 f_print(fout, "fail:\n");
1284 f_print(fout, "\tz_result = rx_EndCall(z_call, z_result);\n");
1286 if (xflag && split_flag != 1) {
1287 f_print(fout, "\tif (rx_enable_stats) {\n");
1288 if (PackageStatIndex[PackageIndex]) {
1290 "\t rx_RecordCallStatistics(z_call, %s,\n",
1291 PackageStatIndex[PackageIndex]);
1294 "\t rx_RecordCallStatistics(z_call, \n"
1295 "\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
1296 "\t\t((afs_uint32)ntohs(rx_PortOf(rx_PeerOf(rx_ConnectionOf(z_call)))))),\n");
1298 f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, 1);\n",
1299 no_of_stat_funcs, PackagePrefix[PackageIndex]);
1300 f_print(fout, "\t}\n\n");
1302 f_print(fout, "\treturn z_result;\n}\n\n");
1307 ss_Proc_CodeGeneration(definition * defp)
1315 ss_ProcName_setup(defp);
1317 ss_ProcParams_setup(defp);
1318 ss_ProcSpecial_setup(defp);
1319 ss_ProcUnmarshallInParams_setup(defp);
1320 ss_ProcCallRealProc_setup(defp);
1321 ss_ProcMarshallOutParams_setup(defp);
1322 ss_ProcTail_setup(defp);
1328 ss_ProcName_setup(definition * defp)
1332 if ((strlen(prefix) + strlen(PackagePrefix[PackageIndex]) +
1333 strlen(defp->pc.proc_name)) >= MAX_FUNCTION_NAME_LEN) {
1334 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1338 f_print(fout, "static afs_int32 _%s%s%s(", prefix,
1339 PackagePrefix[PackageIndex], defp->pc.proc_name);
1340 f_print(fout, "struct rx_call *z_call, XDR *z_xdrs)\n{\n");
1341 f_print(fout, "\t" "afs_int32 z_result;\n");
1343 for (plist = defp->pc.plists; plist; plist = plist->next)
1344 if (plist->component_kind == DEF_PARAM) {
1345 plist->pl.param_flag &= ~(PROCESSED_PARAM);
1346 plist->pl.string_name = NULL;
1353 ss_ProcParams_setup(definition * defp)
1355 proc1_list *plist, *plist1;
1359 for (plist = defp->pc.plists; plist; plist = plist->next) {
1360 if ((plist->component_kind == DEF_PARAM)
1361 && !(plist->pl.param_flag & PROCESSED_PARAM)) {
1362 if (plist->pl.param_flag & INDIRECT_PARAM) {
1363 char pres = '\0', *pntr = strchr(plist->pl.param_type, '*');
1369 f_print(fout, "\t%s %s", plist->pl.param_type,
1370 plist->pl.param_name);
1373 } else if (strchr(plist->pl.param_type, '*') == 0) {
1374 f_print(fout, "\t%s %s", plist->pl.param_type,
1375 plist->pl.param_name);
1377 plist->pl.param_flag |= FREETHIS_PARAM;
1378 f_print(fout, "\t%s %s=(%s)0", plist->pl.param_type,
1379 plist->pl.param_name, plist->pl.param_type);
1381 plist->pl.param_flag |= PROCESSED_PARAM;
1382 for (plist1 = defp->pc.plists; plist1; plist1 = plist1->next) {
1383 if ((plist1->component_kind == DEF_PARAM)
1384 && streq(plist->pl.param_type, plist1->pl.param_type)
1385 && !(plist1->pl.param_flag & PROCESSED_PARAM)) {
1386 if (plist1->pl.param_flag & INDIRECT_PARAM) {
1387 f_print(fout, ", %s", plist1->pl.param_name);
1388 } else if (strchr(plist1->pl.param_type, '*') == 0) {
1389 f_print(fout, ", %s", plist1->pl.param_name);
1391 plist1->pl.param_flag |= FREETHIS_PARAM;
1392 f_print(fout, ", *%s=(%s)0", plist1->pl.param_name,
1393 plist1->pl.param_type);
1395 plist1->pl.param_flag |= PROCESSED_PARAM;
1398 f_print(fout, ";\n");
1401 for (listp = typedef_defined; listp != NULL; listp = listp->next) {
1402 defp1 = (definition *) listp->val;
1403 for (plist = defp->pc.plists; plist; plist = plist->next) {
1404 if (plist->component_kind == DEF_PARAM
1405 && (plist->pl.param_kind == DEF_OUTPARAM
1406 || plist->pl.param_kind == DEF_INOUTPARAM)
1407 && !(plist->pl.param_flag & FREETHIS_PARAM)) {
1408 if (streq(defp1->def_name, structname(plist->pl.param_type))) {
1409 switch (defp1->pc.rel) {
1419 fprintf(fout, "\n");
1424 ss_ProcSpecial_setup(definition * defp)
1430 for (listp = special_defined; listp != NULL; listp = listp->next) {
1431 defp1 = (definition *) listp->val;
1433 for (plist = defp->pc.plists; plist; plist = plist->next) {
1434 if (plist->component_kind == DEF_PARAM
1435 && (plist->pl.param_kind == DEF_INPARAM
1436 || plist->pl.param_kind == DEF_INOUTPARAM)) {
1437 spec_list *spec = defp1->def.sd.specs;
1439 strcpy(string, structname(spec->sdef.string_value));
1440 if (streq(string, structname(plist->pl.param_type))) {
1441 plist->pl.string_name = spec->sdef.string_name;
1442 plist->pl.param_flag |= FREETHIS_PARAM;
1447 for (listp = typedef_defined; listp != NULL; listp = listp->next) {
1448 defp1 = (definition *) listp->val;
1449 for (plist = defp->pc.plists; plist; plist = plist->next) {
1450 if (plist->component_kind == DEF_PARAM) {
1451 if (streq(defp1->def_name, structname(plist->pl.param_type))) {
1452 plist->pl.param_flag |= FREETHIS_PARAM;
1453 switch (defp1->pc.rel) {
1455 plist->pl.string_name = alloc(40);
1457 s_print(plist->pl.string_name, "val");
1459 s_print(plist->pl.string_name, "%s_val",
1464 plist->pl.string_name = NULL;
1473 for (listp = complex_defined; listp != NULL; listp = listp->next) {
1474 defp1 = (definition *) listp->val;
1475 for (plist = defp->pc.plists; plist; plist = plist->next) {
1476 if (plist->component_kind == DEF_PARAM) {
1477 if (streq(defp1->def_name, structname(plist->pl.param_type))) {
1478 plist->pl.param_flag |= FREETHIS_PARAM;
1484 for (plist = defp->pc.plists; plist; plist = plist->next) {
1485 if (plist->component_kind == DEF_PARAM) {
1486 fprintf(fout, "\n\tmemset(&%s, 0, sizeof(%s));",
1487 plist->pl.param_name,
1488 plist->pl.param_name);
1492 f_print(fout, "\n");
1497 ss_ProcUnmarshallInParams_setup(definition * defp)
1499 int noofparams, noofoutparams, i;
1502 noofparams = defp->pc.paramtypes[IN] + defp->pc.paramtypes[INOUT];
1503 noofoutparams = defp->pc.paramtypes[INOUT] + defp->pc.paramtypes[OUT];
1504 for (plist = defp->pc.plists, i = 0; plist; plist = plist->next) {
1505 if (plist->component_kind == DEF_PARAM
1506 && (plist->pl.param_kind == DEF_INPARAM
1507 || plist->pl.param_kind == DEF_INOUTPARAM)) {
1509 f_print(fout, "\n\tif ((!%s)",
1510 (plist->scode ? plist->scode : plist->code));
1512 f_print(fout, "\n\t || (!%s)",
1513 (plist->scode ? plist->scode : plist->code));
1515 if (++i == noofparams) {
1516 if (!noofoutparams) {
1517 f_print(fout, ") {\n");
1519 f_print(fout, ") {\n");
1522 "\t\tz_result = RXGEN_SS_UNMARSHAL;\n\t\tgoto fail;\n\t}\n\n");
1531 ss_ProcCallRealProc_setup(definition * defp)
1536 f_print(fout, "\tz_result = %s%s%s%s(z_call", prefix, ServerPrefix,
1537 PackagePrefix[PackageIndex], defp->pc.proc_name);
1538 for (plist = defp->pc.plists; plist; plist = plist->next) {
1539 if (plist->component_kind == DEF_PARAM) {
1540 if (plist->pl.param_flag & INDIRECT_PARAM) {
1541 f_print(fout, ", &%s", plist->pl.param_name);
1543 if (plist->pl.param_flag & OUT_STRING) {
1544 f_print(fout, ", &%s", plist->pl.param_name);
1546 f_print(fout, ", %s", plist->pl.param_name);
1551 f_print(fout, ");\n");
1553 f_print(fout, "\tif (z_result)\n\t\treturn z_result;\n");
1555 f_print(fout, "\tif (z_result)\n\t\tgoto fail;\n");
1561 ss_ProcMarshallOutParams_setup(definition * defp)
1566 noofparams = defp->pc.paramtypes[INOUT] + defp->pc.paramtypes[OUT];
1568 f_print(fout, "\tz_xdrs->x_op = XDR_ENCODE;\n");
1570 for (plist = defp->pc.plists, i = 0; plist; plist = plist->next) {
1571 if (plist->component_kind == DEF_PARAM
1572 && (plist->pl.param_kind == DEF_OUTPARAM
1573 || plist->pl.param_kind == DEF_INOUTPARAM)) {
1575 f_print(fout, "\tif ((!%s)",
1576 (plist->scode ? plist->scode : plist->code));
1578 f_print(fout, "\n\t || (!%s)",
1579 (plist->scode ? plist->scode : plist->code));
1581 if (++i == noofparams) {
1582 f_print(fout, ")\n\t\tz_result = RXGEN_SS_MARSHAL;\n");
1590 ss_ProcTail_frees(char *xdrfunc, int *somefrees) {
1592 f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
1593 f_print(fout, "\tif ((!%s)", xdrfunc);
1596 f_print(fout, "\n\t || (!%s)", xdrfunc);
1602 ss_ProcTail_setup(definition * defp)
1609 if (defp->can_fail) {
1610 f_print(fout, "fail:\n");
1613 for (plist = defp->pc.plists; plist; plist = plist->next) {
1614 if (plist->component_kind == DEF_PARAM
1615 && (plist->pl.param_flag & FREETHIS_PARAM))
1616 ss_ProcTail_frees(plist->scode, &somefrees);
1619 for (listp = typedef_defined; listp != NULL; listp = listp->next) {
1620 defp1 = (definition *) listp->val;
1621 for (plist = defp->pc.plists; plist; plist = plist->next) {
1622 if (plist->component_kind == DEF_PARAM
1623 && (plist->pl.param_kind == DEF_OUTPARAM
1624 || plist->pl.param_kind == DEF_INOUTPARAM)
1625 && !(plist->pl.param_flag & FREETHIS_PARAM)) {
1626 if (streq(defp1->def_name, structname(plist->pl.param_type))) {
1627 switch (defp1->pc.rel) {
1630 ss_ProcTail_frees(plist->scode, &somefrees);
1640 for (listp = uniondef_defined; listp != NULL; listp = listp->next) {
1641 defp1 = (definition *) listp->val;
1642 for (plist = defp->pc.plists; plist; plist = plist->next) {
1643 if (plist->component_kind == DEF_PARAM
1644 && (plist->pl.param_kind == DEF_OUTPARAM
1645 || plist->pl.param_kind == DEF_INOUTPARAM)
1646 && !(plist->pl.param_flag & FREETHIS_PARAM)) {
1647 if (streq(defp1->def_name, structname(plist->pl.param_type))) {
1648 if (plist->pl.param_flag & INDIRECT_PARAM) {
1649 ss_ProcTail_frees(plist->scode, &somefrees);
1657 f_print(fout, ")\n");
1658 f_print(fout, "\t\tz_result = RXGEN_SS_XDRFREE;\n\n");
1662 f_print(fout, "\tif (rx_enable_stats) {\n");
1663 f_print(fout, "\t rx_RecordCallStatistics(z_call,");
1664 if (PackageStatIndex[PackageIndex]) {
1665 f_print(fout, " %s,\n", PackageStatIndex[PackageIndex]);
1668 "\n\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
1669 "\t\t((afs_uint32)ntohs(rx_ServiceOf(rx_ConnectionOf(z_call))->servicePort))),\n");
1671 f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, 0);\n",
1672 no_of_stat_funcs, PackagePrefix[PackageIndex]);
1673 f_print(fout, "\t}\n\n");
1676 f_print(fout, "\treturn z_result;\n");
1677 f_print(fout, "}\n\n");
1681 ucs_ProcCallback_setup(definition * defp, char *cbheader)
1686 for (plist = defp->pc.plists; plist; plist = plist->next) {
1687 if (plist->component_kind == DEF_PARAM) {
1694 f_print(fout, "struct args_%s%s%s {\n", prefix,
1695 PackagePrefix[PackageIndex], defp->pc.proc_name);
1697 for (plist = defp->pc.plists; plist; plist = plist->next) {
1698 if (plist->component_kind == DEF_PARAM) {
1699 f_print(fout, "\t");
1700 if (plist->pl.param_kind == DEF_INPARAM &&
1701 strcmp(plist->pl.param_type, "char *") == 0) {
1702 f_print(fout, "const ");
1704 if ((plist->pl.param_flag & OUT_STRING) != 0) {
1705 f_print(fout, "%s *%s", plist->pl.param_type,
1706 plist->pl.param_name);
1708 f_print(fout, "%s %s", plist->pl.param_type,
1709 plist->pl.param_name);
1711 f_print(fout, ";\n");
1715 f_print(fout, "};\n");
1718 f_print(fout, "static int\n"
1719 "%s%s%s%s(struct ubik_callrock_info *info, void *z_rock)\n"
1721 cbheader, prefix, PackagePrefix[PackageIndex],
1722 defp->pc.proc_name);
1725 f_print(fout, "\tstruct args_%s%s%s *z_args = z_rock;\n", prefix,
1726 PackagePrefix[PackageIndex], defp->pc.proc_name);
1729 f_print(fout, "\treturn %s%s%s(info->conn", prefix, PackagePrefix[PackageIndex],
1730 defp->pc.proc_name);
1732 for (plist = defp->pc.plists; plist; plist = plist->next) {
1733 if (plist->component_kind == DEF_PARAM) {
1734 f_print(fout, ",\n\t\t\tz_args->%s", plist->pl.param_name);
1738 f_print(fout, ");\n"
1744 ucs_ProcName_setup(definition * defp, char *procheader, int split_flag)
1750 f_print(fout, "int %s%s%s%s(struct ubik_client *aclient, afs_int32 aflags",
1751 procheader, prefix, PackagePrefix[PackageIndex],
1752 defp->pc.proc_name);
1754 f_print(fout, "int %s%s%s%s(aclient, aflags", procheader, prefix,
1755 PackagePrefix[PackageIndex], defp->pc.proc_name);
1758 if ((strlen(procheader) + strlen(prefix) +
1759 strlen(PackagePrefix[PackageIndex]) + strlen(defp->pc.proc_name)) >=
1760 MAX_FUNCTION_NAME_LEN) {
1761 error("function name is too long, increase MAX_FUNCTION_NAME_LEN");
1764 for (plist = defp->pc.plists; plist; plist = plist->next) {
1765 if (plist->component_kind == DEF_PARAM) {
1768 if (plist->pl.param_kind == DEF_INPARAM &&
1769 strcmp(plist->pl.param_type, "char *") == 0) {
1770 f_print(fout, "const ");
1772 if (plist->pl.param_flag & OUT_STRING) {
1773 f_print(fout, "%s *%s", plist->pl.param_type,
1774 plist->pl.param_name);
1776 f_print(fout, "%s %s", plist->pl.param_type,
1777 plist->pl.param_name);
1780 plist->pl.param_flag &= ~PROCESSED_PARAM;
1781 f_print(fout, " %s", plist->pl.param_name);
1785 f_print(fout, ")\n");
1791 ucs_ProcParams_setup(definition * defp, int split_flag)
1793 proc1_list *plist, *plist1;
1798 f_print(fout, "\tstruct ubik_client *aclient;\n\tafs_int32 aflags;\n");
1799 for (plist = defp->pc.plists; plist; plist = plist->next) {
1800 if (plist->component_kind == DEF_PARAM
1801 && !(plist->pl.param_flag & PROCESSED_PARAM)) {
1802 if (plist->pl.param_flag & OUT_STRING) {
1803 f_print(fout, "\t%s *%s", plist->pl.param_type,
1804 plist->pl.param_name);
1806 f_print(fout, "\t%s %s", plist->pl.param_type,
1807 plist->pl.param_name);
1809 plist->pl.param_flag |= PROCESSED_PARAM;
1810 for (plist1 = defp->pc.plists; plist1; plist1 = plist1->next) {
1811 if ((plist1->component_kind == DEF_PARAM)
1812 && streq(plist->pl.param_type, plist1->pl.param_type)
1813 && !(plist1->pl.param_flag & PROCESSED_PARAM)) {
1815 char *pntr = strchr(plist1->pl.param_type, '*');
1818 if (plist1->pl.param_flag & OUT_STRING) {
1819 f_print(fout, ", *%s%s", star, plist1->pl.param_name);
1821 f_print(fout, ", %s%s", star, plist1->pl.param_name);
1823 plist1->pl.param_flag |= PROCESSED_PARAM;
1826 f_print(fout, ";\n");
1832 ucs_ProcTail_setup(definition * defp, char *cbheader, int split_flag)
1837 f_print(fout, "{\n");
1839 for (plist = defp->pc.plists; plist; plist = plist->next) {
1840 if (plist->component_kind == DEF_PARAM) {
1847 f_print(fout, "\tstruct args_%s%s%s args;\n", prefix,
1848 PackagePrefix[PackageIndex], defp->pc.proc_name);
1849 f_print(fout, "\tmemset(&args, 0, sizeof(args));\n\n");
1851 for (plist = defp->pc.plists; plist; plist = plist->next) {
1852 if (plist->component_kind == DEF_PARAM) {
1853 plist->pl.param_flag &= ~PROCESSED_PARAM;
1854 f_print(fout, "\targs.%s = %s;\n", plist->pl.param_name,
1855 plist->pl.param_name);
1859 f_print(fout, "\n\treturn ubik_CallRock(aclient, aflags, %s%s%s%s, &args);\n",
1860 cbheader, prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
1862 f_print(fout, "\treturn ubik_CallRock(aclient, aflags, %s%s%s%s, NULL);\n",
1863 cbheader, prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
1866 f_print(fout, "}\n\n");
1871 opcode_holes_exist(void)
1875 for (i = lowest_opcode[PackageIndex]; i < highest_opcode[PackageIndex];
1877 if (!opcodenum_is_defined(i))
1885 er_Proc_CodeGeneration(void)
1889 temp = PackageIndex;
1890 if (!combinepackages)
1892 for (; PackageIndex <= temp; PackageIndex++) {
1893 if (proc_defined[PackageIndex] == NULL)
1895 if (combinepackages || opcode_holes_exist()) {
1896 er_HeadofOldStyleProc_setup();
1897 er_BodyofOldStyleProc_setup();
1898 er_TailofOldStyleProc_setup();
1899 er_HeadofOldStyleProc_setup2();
1900 er_BodyofOldStyleProc_setup2();
1901 er_TailofOldStyleProc_setup2();
1903 er_ProcDeclExterns_setup();
1904 er_ProcProcsArray_setup();
1905 er_ProcMainBody_setup();
1908 PackageIndex = temp;
1913 er_ProcDeclExterns_setup(void)
1921 f_print(fout, "\n");
1922 for (listp = proc_defined[PackageIndex]; listp != NULL;
1923 listp = listp->next) {
1924 defp = (definition *) listp->val;
1925 if (defp->pc.proc_serverstub) {
1926 f_print(fout, "afs_int32 %s();\n", defp->pc.proc_serverstub);
1933 er_ProcProcsArray_setup(void)
1938 if ((listp = proc_defined[PackageIndex])) {
1939 defp = (definition *) listp->val;
1941 f_print(fout, "\nstatic char *opnames%d[] = {\"%s%s\"",
1942 PackageIndex, defp->pc.proc_prefix, defp->pc.proc_name);
1945 if (defp->pc.proc_serverstub) {
1946 f_print(fout, "\nstatic afs_int32 (*StubProcsArray%d[])() = {%s",
1947 PackageIndex, defp->pc.proc_serverstub);
1950 "\nstatic afs_int32 (*StubProcsArray%d[])(struct rx_call *z_call, XDR *z_xdrs) = {_%s%s%s",
1951 PackageIndex, prefix, defp->pc.proc_prefix,
1952 ((definition *) listp->val)->pc.proc_name);
1955 listp = listp->next;
1957 for (; listp != NULL; listp = listp->next) {
1958 defp = (definition *) listp->val;
1960 f_print(fout, ", \"%s%s\"",defp->pc.proc_prefix,defp->pc.proc_name);
1963 if (defp->pc.proc_serverstub) {
1964 f_print(fout, ",%s", defp->pc.proc_serverstub);
1966 f_print(fout, ", _%s%s%s", prefix, defp->pc.proc_prefix,
1967 defp->pc.proc_name);
1971 f_print(fout, "};\n\n");
1976 er_ProcMainBody_setup(void)
1979 f_print(fout, "char *%sTranslateOpCode(int op)\n{\n",
1980 PackagePrefix[PackageIndex]);
1981 f_print(fout, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
1982 PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
1983 f_print(fout, "\treturn opnames%d[op - %sLOWEST_OPCODE];\n}\n",
1984 PackageIndex, PackagePrefix[PackageIndex]);
1985 f_print(fout, "struct %sstats *%sOpCodeStats(int op)\n{\n",
1986 PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
1987 f_print(fout, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
1988 PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
1989 f_print(fout, "\treturn NULL;/*%d %s*/\n}\n",
1990 PackageIndex, PackagePrefix[PackageIndex]);
1994 f_print(fout, "int %s%sExecuteRequest(struct rx_call *z_call)\n",
1995 prefix, PackagePrefix[PackageIndex]);
1996 f_print(fout, "{\n\tint op;\n");
1997 f_print(fout, "\tXDR z_xdrs;\n");
1998 f_print(fout, "\t" "afs_int32 z_result;\n\n");
1999 f_print(fout, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
2001 "\tif (!xdr_int(&z_xdrs, &op))\n\t\tz_result = RXGEN_DECODE;\n");
2003 "\telse if (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\tz_result = RXGEN_OPCODE;\n",
2004 PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
2006 "\telse\n\t\tz_result = (*StubProcsArray%d[op - %sLOWEST_OPCODE])(z_call, &z_xdrs);\n",
2007 PackageIndex, PackagePrefix[PackageIndex]);
2008 f_print(fout, "\treturn hton_syserr_conv(z_result);\n}\n");
2012 er_HeadofOldStyleProc_setup2(void)
2015 f_print(fout, "int %sOpCodeIndex(int op)\n{\n", (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
2016 f_print(fout, "\tswitch (op) {\n");
2021 er_HeadofOldStyleProc_setup(void)
2024 f_print(fout, "char *%sTranslateOpCode(int op)\n{\n",
2025 (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
2029 "\nint %s%sExecuteRequest (struct rx_call *z_call)\n",
2031 (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
2032 f_print(fout, "{\n");
2033 f_print(fout, "\tint op;\n");
2034 f_print(fout, "\tXDR z_xdrs;\n");
2035 f_print(fout, "\t" "afs_int32 z_result;\n\n");
2036 f_print(fout, "\txdrrx_create(&z_xdrs, z_call, XDR_DECODE);\n");
2037 f_print(fout, "\tz_result = RXGEN_DECODE;\n");
2038 f_print(fout, "\tif (!xdr_int(&z_xdrs, &op)) goto fail;\n");
2040 f_print(fout, "\tswitch (op) {\n");
2044 er_BodyofOldStyleProc_setup(void)
2048 if (combinepackages) {
2049 int temp = PackageIndex;
2050 for (PackageIndex = 0; PackageIndex <= temp; PackageIndex++) {
2051 for (listp = proc_defined[PackageIndex]; listp != NULL;
2052 listp = listp->next)
2053 proc_er_case((definition *) listp->val);
2055 PackageIndex = temp;
2057 for (listp = proc_defined[PackageIndex]; listp != NULL;
2058 listp = listp->next)
2059 proc_er_case((definition *) listp->val);
2065 proc_er_case(definition * defp)
2068 f_print(fout, "\t\tcase %d:", defp->pc.proc_opcodenum);
2069 f_print(fout, "\treturn \"%s%s\";\n",
2070 defp->pc.proc_prefix, defp->pc.proc_name);
2073 if (opcodesnotallowed[PackageIndex]) {
2074 f_print(fout, "\t\tcase %d:\n", defp->pc.proc_opcodenum);
2076 f_print(fout, "\t\tcase %s:\n", defp->pc.proc_opcodename);
2078 if (defp->pc.proc_serverstub) {
2079 f_print(fout, "\t\t\tz_result = %s(z_call, &z_xdrs);\n",
2080 defp->pc.proc_serverstub);
2082 f_print(fout, "\t\t\tz_result = _%s%s%s(z_call, &z_xdrs);\n", prefix,
2083 defp->pc.proc_prefix, defp->pc.proc_name);
2085 f_print(fout, "\t\t\tbreak;\n");
2089 proc_op_case(definition * defp)
2091 f_print(fout, "\t\tcase %d:", defp->pc.proc_opcodenum);
2092 f_print(fout, "\treturn %d;\n",
2097 er_BodyofOldStyleProc_setup2(void)
2103 if (combinepackages) {
2104 int temp = PackageIndex;
2105 for (PackageIndex = 0; PackageIndex <= temp; PackageIndex++) {
2106 for (listp = proc_defined[PackageIndex]; listp != NULL;
2107 listp = listp->next)
2108 proc_op_case((definition *) listp->val);
2110 PackageIndex = temp;
2112 for (listp = proc_defined[PackageIndex]; listp != NULL;
2113 listp = listp->next)
2114 proc_op_case((definition *) listp->val);
2119 er_TailofOldStyleProc_setup2(void)
2122 f_print(fout, "\t\tdefault:\n");
2123 f_print(fout, "\t\t\treturn -1;\n\t}\n}\n");
2128 er_TailofOldStyleProc_setup(void)
2130 f_print(fout, "\t\tdefault:\n");
2132 f_print(fout, "\t\t\treturn NULL;\n\t}\n}\n");
2135 f_print(fout, "\t\t\tz_result = RXGEN_OPCODE;\n");
2136 f_print(fout, "\t\t\tbreak;\n\t}\n");
2137 f_print(fout, "fail:\n");
2138 f_print(fout, "\treturn z_result;\n}\n");
2142 h_ProcMainBody_setup(void)
2144 f_print(fout,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
2145 prefix, PackagePrefix[PackageIndex]);
2149 h_HeadofOldStyleProc_setup(void)
2151 char *pprefix = (combinepackages ? MasterPrefix :
2152 PackagePrefix[PackageIndex]);
2153 f_print(fout,"\nstruct %sstats{\n\tint statsver;\n};", pprefix);
2154 f_print(fout,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
2156 f_print(fout,"\nextern int %sOpCodeIndex(int op);\n", PackagePrefix[PackageIndex]);
2160 h_Proc_CodeGeneration(void)
2164 temp = PackageIndex;
2165 if (!combinepackages)
2167 for (; PackageIndex <= temp; PackageIndex++) {
2168 if (combinepackages || opcode_holes_exist()) {
2169 h_HeadofOldStyleProc_setup();
2171 h_ProcMainBody_setup();
2174 PackageIndex = temp;
2178 proc_h_case(definition * defp)
2180 f_print(fout, "#define opcode_%s%s \t((afs_uint64)((%uLL << 32) + %sOpCodeIndex(%u)))\n",
2181 defp->pc.proc_prefix, defp->pc.proc_name, StatIndex,
2182 defp->pc.proc_prefix, defp->pc.proc_opcodenum);
2186 h_opcode_stats_pkg(char *pprefix, int lowest, int highest, int nops,
2187 int statfuncs, char *ptype, list *proclist)
2195 "\n/* Opcode-related useful stats for %spackage: %s */\n",
2197 f_print(fout, "#define %sLOWEST_OPCODE %d\n", pprefix, lowest);
2198 f_print(fout, "#define %sHIGHEST_OPCODE %d\n", pprefix, highest);
2199 f_print(fout, "#define %sNUMBER_OPCODES %d\n\n", pprefix, nops);
2201 for (listp = proclist; listp != NULL;
2202 listp = listp->next)
2203 proc_h_case((definition *) listp->val);
2206 f_print(fout, "#define %sNO_OF_STAT_FUNCS\t%d\n\n",
2207 pprefix, statfuncs);
2208 f_print(fout, "AFS_RXGEN_EXPORT\n");
2209 f_print(fout, "extern const char *%sfunction_names[];\n\n",
2215 h_opcode_stats(void)
2217 if (combinepackages) {
2218 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]);
2221 for (i = 0; i <= PackageIndex; i++) {
2222 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]);
2229 generate_multi_macros(definition * defp)
2231 char *startname = SplitStart, *endname = SplitEnd;
2240 f_print(fout, "\n#include <rx/rx_multi.h>");
2242 f_print(fout, "\n#define multi_%s%s(", PackagePrefix[PackageIndex],
2243 defp->pc.proc_name);
2244 for (plist = defp->pc.plists; plist; plist = plist->next) {
2245 if (plist->component_kind == DEF_PARAM) {
2248 f_print(fout, "%s", plist->pl.param_name);
2250 f_print(fout, ", %s", plist->pl.param_name);
2254 f_print(fout, ") \\\n");
2256 startname = "Start";
2259 f_print(fout, "\tmulti_Body(%s%s%s(multi_call", startname,
2260 PackagePrefix[PackageIndex], defp->pc.proc_name);
2261 do_split(defp, OUT, &numofparams, DEF_OUTPARAM, 0);
2262 for (plist = defp->pc.plists; plist; plist = plist->next) {
2263 if (plist->component_kind == DEF_PARAM)
2264 f_print(fout, ", %s", plist->pl.param_name);
2266 do_split(defp, OUT, &numofparams, DEF_OUTPARAM, 1);
2267 f_print(fout, "), %s%s%s(multi_call", endname,
2268 PackagePrefix[PackageIndex], defp->pc.proc_name);
2269 do_split(defp, IN, &numofparams, DEF_INPARAM, 0);
2270 for (plist = defp->pc.plists; plist; plist = plist->next) {
2271 if (plist->component_kind == DEF_PARAM) {
2272 f_print(fout, ", %s", plist->pl.param_name);
2275 do_split(defp, IN, &numofparams, DEF_INPARAM, 1);
2276 f_print(fout, "))\n\n");
2281 IsRxgenToken(token * tokp)
2283 if (tokp->kind == TOK_PACKAGE || tokp->kind == TOK_PREFIX
2284 || tokp->kind == TOK_SPECIAL || tokp->kind == TOK_STARTINGOPCODE
2285 || tokp->kind == TOK_SPLITPREFIX || tokp->kind == TOK_PROC
2286 || tokp->kind == TOK_STATINDEX)
2292 IsRxgenDefinition(definition * def)
2294 if (def->def_kind == DEF_PACKAGE || def->def_kind == DEF_PREFIX
2295 || def->def_kind == DEF_SPECIAL || def->def_kind == DEF_STARTINGOPCODE
2296 || def->def_kind == DEF_SPLITPREFIX || def->def_kind == DEF_PROC)