I was wrong about using unsigned offsets.
The result of pointer math will always be a ptrdiff_t, which is to say signed.
I can’t *get* an unsigned diff… well, mmm, unless I cast the pointers to unsigned ints first…?
I’m starting to worry that I’m pushing the limits here though.
In other news, where the offset/version combo for an offset has to be signed for the offset and unsigned for the version, an array of lfds720_pal_uint_t doesn’t work. I can take the address of the first element, cast it to a pointer to ptrdiff_t and then deref, but actually, having gone over the struct packing stuff again to be sure, I think I will actually be fine using a struct. I didn’t want to go that way, I felt it was opening a window for compiles to get things wrong, but I read a very nice article about it and now I feel happy.
This is the article;
“The interesting news is that NTP has apparently being getting away with this for decades across a very wide span of hardware, operating systems, and compilers, including not just Unixes but under Windows variants as well. This suggests that platforms with padding rules other than self-alignment are either nonexistent or confined to such specialized niches that they’re never either NTP servers or clients.”
Anyways, the structures are nicer than the two element array – it’s clearer what’s going on.