Remove automated casting in rxgen
[openafs.git] / src / rxgen / rpc_cout.c
index 4868a0f..3ddb27a 100644 (file)
@@ -72,7 +72,7 @@ static void print_rxifsizeof(char *prefix, char *type);
 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);
@@ -98,7 +98,7 @@ emit(definition * 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));
@@ -199,6 +199,42 @@ space(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)
 {
@@ -239,6 +275,14 @@ print_ifstat(int indent, char *prefix, char *type, relation rel, char *amax,
            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);
@@ -251,21 +295,12 @@ print_ifstat(int indent, char *prefix, char *type, relation rel, char *amax,
                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);
@@ -275,10 +310,21 @@ print_ifstat(int indent, char *prefix, char *type, relation rel, char *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");
+    }
+
 }