[OpenAFS-devel] Simplifying rxgen output
Simon Wilkinson
sxw@inf.ed.ac.uk
Sat, 13 Feb 2010 09:48:38 +0000
I've been recently playing around a lot with the output from rxgen, and =
am finding the structures it builds cumbersome and ugly - in particular =
when dealing with opaques, vectors and unions.
Take, for example, the following section of xg:
struct test {
opaque mydata;
};
union testgroup switch (afs_int32 type) {
case 0:
test firstDataSet;
};
This produces the following output as standard:
struct test {
struct mydata {
u_int mydata_len;
char *mydata_val;
} mydata;
};
typedef struct test test;
struct testgroup {
afs_int32 type;
union {
test firstDataSet;
} testgroup_u;
};
typedef struct testgroup testgroup;
There's a couple of problems here. The first is that access elements of =
the opaque is very cumbersome. With 'example' being an instance of =
struct testgroup, we have:
example.testgroup_u.firstDataSet.mydata.mydata_val;
I'd like to change this so we can use
example.u.firstDataSet.mydata.val
by removing the name of the structure in the union declaration, and in =
the len and val attributes of any vector.
The second problem is that in the 'test' example above, the name of the =
element (in this case mydata) has also been used to name the structure. =
This means that every opaque is tied to the name it was called in a =
particular structure - you can't copy opaques between structures without =
explicit, ugly, casts. I'd like to proposed that we use the same =
approach as Heimdal, and actually define ...
struct rxgen_opaque {
u_int len;
char * val;
}
... and use this in the XDR whenever opaques are required.
I know that these changes aren't backwards compatible, and may break =
out-of-tree users, so I'm proposing that they're only done if a new flag =
is supplied to rxgen - I'm considering using '-b' (for "brief")
Comments?
Simon.=