> > #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).

Reply via email to