/* static prototypes */
static void isdefined(definition * defp);
static void def_struct(definition * defp);
-static void def_program(definition * defp);
static void def_enum(definition * defp);
static void def_const(definition * defp);
static void def_union(definition * defp);
static void er_ProcProcsArray_setup(void);
static void er_ProcMainBody_setup(void);
static void er_HeadofOldStyleProc_setup(void);
+static void er_HeadofOldStyleProc_setup2(void);
static void er_BodyofOldStyleProc_setup(void);
+static void er_BodyofOldStyleProc_setup2(void);
static void proc_er_case(definition * defp);
static void er_TailofOldStyleProc_setup(void);
+static void er_TailofOldStyleProc_setup2(void);
case TOK_ENUM:
def_enum(defp);
break;
- case TOK_PROGRAM:
- def_program(defp);
- break;
case TOK_CONST:
def_const(defp);
break;
case TOK_EOF:
- return (NULL);
+ free(defp);
+ return NULL;
case TOK_PACKAGE:
def_package(defp);
break;
}
static void
-def_program(definition * defp)
-{
- token tok;
- version_list *vlist;
- version_list **vtailp;
- proc_list *plist;
- proc_list **ptailp;
-
- defp->def_kind = DEF_PROGRAM;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_LBRACE, &tok);
- vtailp = &defp->def.pr.versions;
- scan(TOK_VERSION, &tok);
- do {
- scan(TOK_IDENT, &tok);
- vlist = ALLOC(version_list);
- vlist->vers_name = tok.str;
- scan(TOK_LBRACE, &tok);
- ptailp = &vlist->procs;
- do {
- plist = ALLOC(proc_list);
- get_type(&plist->res_prefix, &plist->res_type, DEF_PROGRAM);
- if (streq(plist->res_type, "opaque")) {
- error("illegal result type");
- }
- scan(TOK_IDENT, &tok);
- plist->proc_name = tok.str;
- scan(TOK_LPAREN, &tok);
- get_type(&plist->arg_prefix, &plist->arg_type, DEF_PROGRAM);
- if (streq(plist->arg_type, "opaque")) {
- error("illegal argument type");
- }
- scan(TOK_RPAREN, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- scan(TOK_SEMICOLON, &tok);
- plist->proc_num = tok.str;
- *ptailp = plist;
- ptailp = &plist->next;
- peek(&tok);
- } while (tok.kind != TOK_RBRACE);
- *vtailp = vlist;
- vtailp = &vlist->next;
- scan(TOK_RBRACE, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- vlist->vers_num = tok.str;
- scan(TOK_SEMICOLON, &tok);
- scan2(TOK_VERSION, TOK_RBRACE, &tok);
- } while (tok.kind == TOK_VERSION);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- defp->def.pr.prog_num = tok.str;
- *vtailp = NULL;
-}
-
-static void
def_enum(definition * defp)
{
token tok;
{
declaration dec;
+ memset(&dec, 0, sizeof(dec));
+
defp->def_kind = DEF_TYPEDEF;
get_declaration(&dec, DEF_TYPEDEF);
defp->def_name = dec.name;
}
dec->rel = REL_ARRAY;
if (peekscan(TOK_RANGLE, &tok)) {
- dec->array_max = "~0"; /* unspecified size, use max */
+ dec->array_max = "~0u"; /* unspecified size, use max */
} else {
scan_num(&tok);
dec->array_max = tok.str;
(void)peekscan(TOK_INT, &tok);
break;
case TOK_VOID:
- if (dkind != DEF_UNION && dkind != DEF_PROGRAM) {
- error("voids allowed only inside union and program definitions");
+ if (dkind != DEF_UNION) {
+ error("voids allowed only inside union definitions");
}
*typep = tok.str;
break;
scan(TOK_IDENT, &tok);
defp->def_name = tok.str;
no_of_stat_funcs = 0;
- if (PackageIndex++ >= MAX_PACKAGES)
+
+ PackageIndex++;
+ if (PackageIndex >= MAX_PACKAGES)
error("Exceeded upper limit of package statements\n");
+
function_list_index = 0;
PackagePrefix[PackageIndex] = tok.str;
if (MasterPrefix == NULL)
prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
function_list_index++;
+ defp->statindex = no_of_stat_funcs;
no_of_stat_funcs_header[PackageIndex]++;
no_of_stat_funcs++;
*Proc_listp = NULL;
}
f_print(fout, "\t%s %s", plist->pl.param_type,
plist->pl.param_name);
- *pntr = pres;
+ if (pntr)
+ *pntr = pres;
} else if (strchr(plist->pl.param_type, '*') == 0) {
f_print(fout, "\t%s %s", plist->pl.param_type,
plist->pl.param_name);
er_HeadofOldStyleProc_setup();
er_BodyofOldStyleProc_setup();
er_TailofOldStyleProc_setup();
+ er_HeadofOldStyleProc_setup2();
+ er_BodyofOldStyleProc_setup2();
+ er_TailofOldStyleProc_setup2();
} else {
er_ProcDeclExterns_setup();
er_ProcProcsArray_setup();
"\nstatic afs_int32 (*StubProcsArray%d[])(struct rx_call *z_call, XDR *z_xdrs) = {_%s%s%s",
PackageIndex, prefix, defp->pc.proc_prefix,
((definition *) listp->val)->pc.proc_name);
- defp = (definition *) listp->val;
}
}
listp = listp->next;
PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
f_print(fout, "\treturn opnames%d[op - %sLOWEST_OPCODE];\n}\n",
PackageIndex, PackagePrefix[PackageIndex]);
+ f_print(fout, "struct %sstats *%sOpCodeStats(int op)\n{\n",
+ PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
+ f_print(fout, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
+ PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
+ f_print(fout, "\treturn NULL;/*%d %s*/\n}\n",
+ PackageIndex, PackagePrefix[PackageIndex]);
+
return;
}
f_print(fout, "int %s%sExecuteRequest(struct rx_call *z_call)\n",
f_print(fout, "\treturn hton_syserr_conv(z_result);\n}\n");
}
+static void
+er_HeadofOldStyleProc_setup2(void)
+{
+ if ( cflag ) {
+ f_print(fout, "int %sOpCodeIndex(int op)\n{\n", (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
+ f_print(fout, "\tswitch (op) {\n");
+ }
+}
static void
er_HeadofOldStyleProc_setup(void)
f_print(fout, "\t\t\tbreak;\n");
}
+static void
+proc_op_case(definition * defp)
+{
+ f_print(fout, "\t\tcase %d:", defp->pc.proc_opcodenum);
+ f_print(fout, "\treturn %d;\n",
+ defp->statindex);
+}
+
+static void
+er_BodyofOldStyleProc_setup2(void)
+{
+ list *listp;
+
+ if (!cflag)
+ return;
+ if (combinepackages) {
+ int temp = PackageIndex;
+ for (PackageIndex = 0; PackageIndex <= temp; PackageIndex++) {
+ for (listp = proc_defined[PackageIndex]; listp != NULL;
+ listp = listp->next)
+ proc_op_case((definition *) listp->val);
+ }
+ PackageIndex = temp;
+ } else {
+ for (listp = proc_defined[PackageIndex]; listp != NULL;
+ listp = listp->next)
+ proc_op_case((definition *) listp->val);
+ }
+}
+
+static void
+er_TailofOldStyleProc_setup2(void)
+{
+ if ( cflag ) {
+ f_print(fout, "\t\tdefault:\n");
+ f_print(fout, "\t\t\treturn -1;\n\t}\n}\n");
+ }
+}
static void
er_TailofOldStyleProc_setup(void)
static void
h_HeadofOldStyleProc_setup(void)
{
+ char *pprefix = (combinepackages ? MasterPrefix :
+ PackagePrefix[PackageIndex]);
+ f_print(fout,"\nstruct %sstats{\n\tint statsver;\n};", pprefix);
f_print(fout,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
- prefix,
- (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
+ prefix, pprefix);
f_print(fout,"\nextern int %sOpCodeIndex(int op);\n", PackagePrefix[PackageIndex]);
}