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_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");
+ }
+
}