> > #define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)
> ])
>
> this is actually done in /sys/src/9/port/devcons.c too:
>
> static uvlong uvorder = 0x0001020304050607ULL;
>
> static uchar*
> le2vlong(vlong *to, uchar *f)
> {
> uchar *t, *o;
> int i;
>
> t = (uchar*)to;
> o = (uchar*)&uvorder;
> for(i = 0; i < sizeof(vlong); i++)
> t[o[i]] = f[i];
> return f+sizeof(vlong);
> }
>
> static uchar*
> vlong2le(uchar *t, vlong from)
> {
> uchar *f, *o;
> int i;
>
> f = (uchar*)&from;
> o = (uchar*)&uvorder;
> for(i = 0; i < sizeof(vlong); i++)
> t[i] = f[o[i]];
> return t+sizeof(vlong);
> }
>
> presotto wrote the code but said he learned the trick from ken.
>
> there, of course, we have a real compiler and don't have to
> write uvlong constants as floating point numbers
> (wow that seems fragile).
Most likely the TRIO_DOUBLE_INDEX macro came from some code
from the pre-long-long days, when you had no other way to
write down an 8 byte value in host endian order (even in a
less than portable way).