#include <afsconfig.h>
#include <afs/param.h>
+#include <roken.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include "rpc_scan.h"
#include "rpc_parse.h"
#include "rpc_util.h"
void
emit(definition * def)
{
- if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
+ if (def->def_kind == DEF_CONST) {
return;
}
print_header(def);
static int
findtype(definition * def, char *type)
{
- if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
+ if (def->def_kind == DEF_CONST) {
return (0);
} else {
return (streq(def->def_name, type));
static void
print_ifarg_with_cast(int ptr_to, char *type, char *arg)
{
- f_print(fout, ptr_to ? ", (%s *) %s" : ", (%s) %s", type, arg);
+ if (streq(type, "bool")) {
+ f_print(fout, ptr_to ? ", (bool_t *) %s" : ", (bool_t) %s", arg);
+ } else {
+ f_print(fout, ptr_to ? ", (%s *) %s" : ", (%s) %s", type, arg);
+ }
}
static void
}
static void
+print_ifarg_val(char *objname, char *name)
+{
+ if (*objname == '&') {
+ if (brief_flag) {
+ f_print(fout, "%s.val", objname);
+ } else {
+ f_print(fout, "%s.%s_val", objname, name);
+ }
+ } else {
+ if (brief_flag) {
+ f_print(fout, "&%s->val", objname);
+ } else {
+ f_print(fout, "&%s->%s_val", objname, name);
+ }
+ }
+}
+
+static void
+print_ifarg_len(char *objname, char *name)
+{
+ if (*objname == '&') {
+ if (brief_flag) {
+ f_print(fout, "%s.len", objname);
+ } else {
+ f_print(fout, "%s.%s_len", objname, name);
+ }
+ } else {
+ if (brief_flag) {
+ f_print(fout, "&%s->len", objname);
+ } else {
+ f_print(fout, "&%s->%s_len", objname, name);
+ }
+ }
+}
+
+static void
print_ifstat(int indent, char *prefix, char *type, relation rel, char *amax,
char *objname, char *name)
{
alt = "string";
} else if (streq(type, "opaque")) {
alt = "bytes";
+ tabify(fout, indent);
+ f_print(fout, "{\n");
+ ++indent;
+ tabify(fout, indent);
+ f_print(fout, "u_int __len = (u_int) ");
+ f_print(fout, "*(");
+ print_ifarg_len(objname, name);
+ f_print(fout, ");\n");
}
if (streq(type, "string")) {
print_ifopen(indent, alt);
print_ifopen(indent, "array");
print_ifarg("(caddr_t *)");
}
- if (*objname == '&') {
- if (brief_flag) {
- f_print(fout, "%s.val, (u_int *)%s.len", objname, objname);
- } else {
- f_print(fout, "%s.%s_val, (u_int *)%s.%s_len",
- objname, name, objname, name);
- }
+ print_ifarg_val(objname, name);
+ f_print(fout, ", ");
+ if (streq(type, "opaque")) {
+ f_print(fout, "&__len");
} else {
- if (brief_flag) {
- f_print(fout, "&%s->val, (u_int *)&%s->len",
- objname, objname);
- } else {
- f_print(fout, "&%s->%s_val, (u_int *)&%s->%s_len",
- objname, name, objname, name);
- }
+ print_ifarg_len(objname, name);
}
}
print_ifarg(amax);
break;
case REL_ALIAS:
print_ifopen(indent, type);
- print_ifarg_with_cast(1, type, objname);
+ print_ifarg(objname);
break;
}
print_ifclose(indent);
+ if (rel == REL_ARRAY && streq(type, "opaque")) {
+ tabify(fout, indent);
+ f_print(fout, "*(");
+ print_ifarg_len(objname, name);
+ f_print(fout, ")");
+ f_print(fout, " = __len;\n");
+ --indent;
+ tabify(fout, indent);
+ f_print(fout, "}\n");
+ }
+
}
} else if (streq(type, "opaque")) {
alt = "opaque";
}
- if (alt) {
+ if (alt)
print_rxifopen(alt);
- print_rxifarg(amp, objname, 0);
- } else {
+ else
print_rxifopen("vector");
- print_rxifarg(amp, "(char *)", 0);
- sprintf(temp, "%s", objname);
- strcat(Proc_list->code, temp);
- strcat(Proc_list->scode, temp);
- }
+
+ print_rxifarg(amp, "(char *)", 0);
+ sprintf(temp, "%s", objname);
+ strcat(Proc_list->code, temp);
+ strcat(Proc_list->scode, temp);
print_rxifarg("", amax, 1);
if (!alt) {
print_rxifsizeof(prefix, type);
Proc_list->pl.param_flag |= OUT_STRING;
print_rxifarg("", objname, 0);
} else
- print_rxifarg("&", objname, 0);
+ print_rxifarg("(char **) &", objname, 0);
/* print_rxifarg(amp, objname, 0); */
print_rxifarg("", amax, 1);
if (!alt) {